是否为空指针未定义行为分配特定内存?
Is alocating specific memory for a void pointer undefined behaviour?
我遇到过一种情况,我认为这是未定义的行为:有一个结构有一些成员,其中一个是空指针(这不是我的代码,也不是 public ,我想 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)开始时也有一个Segmentation fault(我想是在第一次调用分配内存的函数时).
更多,如果我添加了值的打印:
std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl;
在try块之前,一直贯穿到end。我已经完成此打印以查看是否存在有关结构指针的其他问题,但打印的值不是 0 或负值。
我看过这些主题:topic1, topic2, topic3 我认为有一些 UB 链接到 void 指针。谁能帮我指出这里的问题,以便我解决,谢谢?
不,这本身不是未定义的行为。通常,当代码 "crashes at the allocation part" 时,这是因为之前的某些事情弄乱了堆,通常是通过写入超过已分配块的一端或多次释放同一块。简而言之:错误不在这段代码中。
空指针在 C/C++ 中是一件非常好的事情,你通常可以将 from/to 转换为其他类型
当您在初始化时遇到段错误时,这意味着一些使用的参数本身无效或如此:
- someStrPtr 有效吗?
- someStrPtr->someVal 和 someStrPtr->someotherVal 有效吗?
- 打印的值是否符合您的预期?
- 此外,如果这是一个多线程应用程序,请确保没有其他线程正在访问这些变量(尤其是在您的打印和初始化语句之间)。这才是真正难抓的
我遇到过一种情况,我认为这是未定义的行为:有一个结构有一些成员,其中一个是空指针(这不是我的代码,也不是 public ,我想 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)开始时也有一个Segmentation fault(我想是在第一次调用分配内存的函数时).
更多,如果我添加了值的打印:
std::cout << someStrPtr->someVal << " " << someStrPtr->someOtherVal << std::endl;
在try块之前,一直贯穿到end。我已经完成此打印以查看是否存在有关结构指针的其他问题,但打印的值不是 0 或负值。
我看过这些主题:topic1, topic2, topic3 我认为有一些 UB 链接到 void 指针。谁能帮我指出这里的问题,以便我解决,谢谢?
不,这本身不是未定义的行为。通常,当代码 "crashes at the allocation part" 时,这是因为之前的某些事情弄乱了堆,通常是通过写入超过已分配块的一端或多次释放同一块。简而言之:错误不在这段代码中。
空指针在 C/C++ 中是一件非常好的事情,你通常可以将 from/to 转换为其他类型
当您在初始化时遇到段错误时,这意味着一些使用的参数本身无效或如此:
- someStrPtr 有效吗?
- someStrPtr->someVal 和 someStrPtr->someotherVal 有效吗?
- 打印的值是否符合您的预期?
- 此外,如果这是一个多线程应用程序,请确保没有其他线程正在访问这些变量(尤其是在您的打印和初始化语句之间)。这才是真正难抓的