正在为空指针未定义行为分配特定的内存

Is alocating specific memory for a void pointer undefined behaviour?

本文关键字:分配 内存 空指针 未定义      更新时间:2023-10-16

我遇到了一种情况,我认为这是未定义的行为:有一个结构,有一些成员,其中一个是一个void指针(它不是我的代码,它不是公共的,我想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)崩溃(几次它工作,有更多的调用这个函数,更多的情况)。我在调试中见过这个

我也知道在Windows上(我的机器使用的是Linux)在开始时也有一个分段错误(我想是在分配内存的函数的第一次调用中)。

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

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

在try块之前,它运行到end。我做这个打印是为了看看是否有其他关于结构指针的问题,但是打印的值不是0或负的。

我看过这些主题:topic1, topic2, topic3,我认为有一些UB链接到空指针。有没有人可以帮助我指出这里的问题,这样我就可以解决它,谢谢?

不,这本身并不是未定义行为。一般来说,当代码"在分配部分崩溃"时,这是因为之前的东西弄乱了堆,通常是通过写过已分配块的一端或多次释放同一块。简而言之:错误不在此代码中。

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

当您在初始化时遇到段错误时,这意味着一些使用的参数本身是无效的:

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