C++ 对指针的引用:不一致的段错误
c++ reference to pointer: inconsistent segfault
我正在与一个大项目合作。由于我们代码的基础设施,基本上所有函数都必须"通过引用返回":
void doSomething(TYPE &result) {
// do something to result
}
但是,在尝试使用对指针的引用时,我遇到了一些分段错误。特别是当我试图清理记忆时,坏事发生了。为了尝试理解段错误,我制作了一个非常简单的测试代码。我的第一次尝试编译并运行没有任何错误:
int main() {
int* a;
delete a; // Seems to cause no problem!
}
由于这有效,我决定尝试类似的东西,引用指针:
int main() {
int* a;
delete a; // Suddenly, this line is an "invalid delete".
int*& b = a;
}
为什么会突然出现段错误?另外,如果存在一种"正确的方法"来清理指针通过引用保留的内存,那是什么?
一些研究笔记:
我试图在StackOverflow上找到一些答案。根据删除 NULL 指针是否安全,删除 NULL 指针应该是安全的?...我的指针完全未初始化,所以我可能正在做一些愚蠢的事情。但是,在我的大型协作代码中,我必须非常深入地挖掘才能初始化这种指向 NULL 的指针。
我还尝试了解对指针的一般引用。另一篇StackOverflow帖子建议 http://markgodwin.blogspot.co.il/2009/08/c-reference-to-pointer.html。这是一个很好的阅读,但没有解决我的问题。
提前感谢!
在未初始化的指针上调用 delete 会产生未定义的行为。因此,它有时可能不会给您带来问题,但有时可能会崩溃。
对未初始化的变量执行的任何类型的访问(除了初始化它(都会导致未定义的行为。 例如,读取它,比较它,删除它。
如果您认为未初始化的指针将被NULL
,那么您就错了。 它实际上是未初始化的,访问其值会导致未定义的行为。
语句delete a
访问a
的值,这本身会导致未定义的行为。
对不是由相应运算符 new 生成的任何非 NULL 指针使用运算符删除会给出未定义的行为(无论该指针是否具有有效值(。
未定义的行为可以给出任何结果。 包括您描述的不一致。
您的示例不是很好,因为"a"仅在调试模式下为 NULL,而在发布模式下将未定义。它可以包含任何随机值。
您可能希望在堆栈上创建对象,如下所示:
void foo() {
TYPE myObj; // this calls the default c-tor, creating the obj on stack
// the object will de destroyed when the executions goes out of scope.
// if you pass the object reference to another function that keeps the
// reference for future use you are in trouble, as the object will be
// destroyed when out of this scope...
}
或者,在堆上创建对象,使用 new :
void foo() {
TYPE * myObj = new TYPE(); // here you need to take care of
// destroying the object yourself (delete myObj)
}
最好是使用智能指针。检查提升,强烈推荐。http://www.boost.org/
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?