我遇到了一种情况,我认为它是未定义的行为:有一个结构有一些成员,其中一个是无效指针(它不是我的代码而且它不公开,我想是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或负。
我已经看过这些主题:topic1,topic2,topic3我认为有一些UB链接到void指针。谁能帮助我指出这里的问题所以我可以解决它,谢谢?
答案 0 :(得分:3)
不,这本身并不是未定义的行为。通常,当代码“在分配部分崩溃”时,这是因为之前的某些东西搞砸了堆,通常是通过写入已分配块的一端或多次释放同一块。简而言之:该错误不在此代码中。
答案 1 :(得分:2)
在C / C ++中,void指针是一件非常好的事情,你通常可以从/向其他类型转换
当你在初始化时遇到seg-fault时,这意味着一些使用过的参数本身也是无效的: