2016-09-19 36 views
0

我遇到了一种情况,我认为它是未定义的行为:有一个结构有一些成员,其中一个是void指针(它不是我的代码,它不是公开的,我想void指针是使其更通用)。在某些时候,这个指针分配一些字符内存:是否为void指针未定义行为分配特定内存?

void fooTest(ThatStructure * someStrPtr) { 
    try { 
     someStrPtr->voidPointer = new char[someStrPtr->someVal + someStrPtr->someOtherVal]; 
    } catch (std::bad_alloc$ ba) { 
     std::cerr << ba.what << std::endl; 
    } 
    // ... 

,并在某些时候它崩溃的分配单元(new运算符)与段错误(它的工作原理了几次,有此功能的更多的呼叫,更多情况)。我在调试中看到了这一点。我也知道,在Windows上(我的机器使用Linux),在开始时也存在分段错误(我想在分配内存的函数的第一次调用中)。

更多,如果我增加值的打印:

std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl; 

try块之前,它贯穿到底。我已经完成了这个打印以查看是否存在有关结构指针的其他问题,但打印的值不是0或负值。

我看过这些话题:topic1,topic2,topic3我在想,有一些UB链接到void指针。任何人都可以帮助我指出这个问题,所以我可以解决它,谢谢?

+2

请提供[mcve]。给'void *'分配一个char *'是非常好的。 – Barry

+0

这是一个多线程应用程序吗? – NathanOliver

+4

'bad_aloc $ ba'? – AnT

回答

2

一个空指针是一个完全正常的事情在C/C++做++,你通常可以从/转换为其他类型

当你得到一个赛格故障而初始化,这意味着一些使用的参数是他们自己无效或如此:

  • Is someStrPtr valid?
  • is someStrPtr-> someVal and someStrPtr-> someotherVal valid?
  • 打印的值是您期望的值吗?
  • 此外,如果这是一个多线程应用程序,请确保没有其他线程正在访问这些变量(特别是在您的打印和初始化语句之间)。这是真的很难赶上
+0

那么问题是什么? –

+0

还不确定,但是您正在回答这个问题:“在C/C++中,void指针是一件非常好的事情”。其他值似乎是有效的。我添加了'if(!someStrPtr)std :: cout <<“KO”<< std :: endl;'(对于其他人)并且没有打印KO – sop

3

不,这本身并不是未定义的行为。一般来说,当代码“在分配部件崩溃”时,这是因为之前的事情使堆乱了,通常是通过写入一个分配块的一端或多次释放相同的块。简而言之:该错误不在此代码中。

相关问题