【发布时间】: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 或负数。
我看过这些主题:topic1、topic2、topic3,我认为有一些 UB 链接到 void 指针。谁能帮我在这里指出问题,以便我解决它,谢谢?
【问题讨论】:
-
请提供minimal reproducible example。将
char*分配给void*非常好。 -
这是一个多线程应用程序吗?
-
bad_aloc$ ba? -
@NathanOliver :是的,它是一个多线程应用程序。这是一个生产者-消费者
标签: c++ pointers undefined-behavior