【问题标题】:Is alocating specific memory for a void pointer undefined behaviour?是否为 void 指针未定义行为分配特定内存?
【发布时间】:2017-01-27 09:17:48
【问题描述】:

我遇到了一种情况,我认为这是未定义的行为:有一个结构有一些成员,其中一个是 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;
    }
    // ...

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

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

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

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

在 try 块之前,它一直运行到末尾。我做了这个打印,看看结构指针是否存在其他问题,但打印的值不是 0 或负数。

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

【问题讨论】:

  • 请提供minimal reproducible example。将 char* 分配给 void* 非常好。
  • 这是一个多线程应用程序吗?
  • bad_aloc$ ba?
  • @NathanOliver :是的,它是一个多线程应用程序。这是一个生产者-消费者

标签: c++ pointers undefined-behavior


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 那么问题出在哪里?
    • 还不确定,但您正在回答这个问题:“在 C/C++ 中,空指针是一件非常好的事情”。其他值似乎是有效的。我已经添加了if (!someStrPtr) std::cout &lt;&lt; "KO" &lt;&lt; std::endl;(以及其他人)并且没有打印任何 KO
    猜你喜欢
    • 2019-06-25
    • 2011-09-04
    • 2014-06-10
    • 2011-04-19
    • 2016-05-07
    • 1970-01-01
    • 2016-05-06
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多