是否为void指针的未定义行为分配特定内存?

时间:2016-09-19 15:57:09

标签: c++ pointers undefined-behavior

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

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

并且在某些时候它在分配部分(operator new)崩溃并出现Segmentation fault(有几次它有效,有更多的函数调用,更多的情况)。我在调试中看到过这个。

我也知道在Windows上(我的机器正在使用Linux)开头也有一个Segmentation故障(我想在分配内存的函数的第一次调用中)。

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

std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl;
在try块之前

,它会一直运行到底。这个打印我已经完成,看看是否有关于结构指针的其他问题,但是值被打印而不是0或负。

我已经看过这些主题:topic1topic2topic3我认为有一些UB链接到void指针。谁能帮助我指出这里的问题所以我可以解决它,谢谢?

2 个答案:

答案 0 :(得分:3)

不,这本身并不是未定义的行为。通常,当代码“在分配部分崩溃”时,这是因为之前的某些东西搞砸了堆,通常是通过写入已分配块的一端或多次释放同一块。简而言之:该错误不在此代码中。

答案 1 :(得分:2)

在C / C ++中,void指针是一件非常好的事情,你通常可以从/向其他类型转换

当你在初始化时遇到seg-fault时,这意味着一些使用过的参数本身也是无效的:

  • someStrPtr有效吗?
  • 是someStrPtr-&gt; someVal和someStrPtr-&gt; someotherVal有效吗?
  • 打印的值是您所期望的吗?
  • 此外,如果这是一个多线程应用程序,请确保没有其他线程正在访问这些变量(特别是在您的打印和初始化语句之间)。这是真正难以捕捉的内容