正在为空指针未定义行为分配特定的内存
Is alocating specific memory for a void pointer undefined behaviour?
我遇到了一种情况,我认为这是未定义的行为:有一个结构,有一些成员,其中一个是一个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有效吗?
- 打印的值是您所期望的吗? 另外,如果这是一个多线程应用程序,请确保没有其他线程正在访问这些变量(特别是在打印和初始化语句之间)。这才是真正难以捕捉的
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?