导致SegFault C++的析构函数
Destructor causing SegFault C++
class Pair {
public:
int *pa,*pb;
Pair(int a, int b)
{
pa = new int(a);
pb = new int(b);
}
Pair(const Pair& other) {
int* pc = new int(*other.pa);
int* pd = new int(*other.pb);
}
~Pair() {
delete pa;
delete pb;
}
};
在这个程序中,编译器产生了分段错误(核心转储(,在完全删除析构函数后,我们可以让程序在没有任何错误的情况下运行,所以有人能帮我吗?此外,即使在参数化构造函数中,我初始化了指针,编译器也会发出警告,指出点pa和pb没有初始化。
:您的复制构造函数正在创建两个指针,然后将它们泄漏出去。它从不设置类的成员变量。
您可能想参考3/five/etc规则,为了清楚起见,默认构造函数delete
不会受到影响。
class Pair {
public:
int *pa, *pb;
Pair() = delete;
Pair(int a, int b): pa{new int{a}}, pb{new int{b}} {}
Pair(const Pair& other): pa{new int{*other.pa}}, pb{new int{*other.pb} {}
~Pair(){
delete pa;
delete pb;
}
};
对于您的复制构造函数,您应该(很可能(这样做:
Pair(const Pair& other) {
pa = new int(*other.pa);
pb = new int(*other.pb);
}
这是你所期望的复制构造函数所做的
使用您的代码,当您通过的复制构造函数对生成的Pair
对象调用析构函数时,您正试图删除未初始化的指针。
可能的问题(尽管仅凭您当前给出的代码很难判断(是以下几行:
int* pc = new int(*other.pa);
int* pd = new int(*other.pb);
这重新声明了新的指针pc
和pd
,而实际上并没有设置成员变量pa
和pb
。一旦构造函数退出,这些新指针就会超出作用域。往好里说,这是一个潜在的内存泄漏,往坏里说,你是未初始化的delete
指针,这可能会导致崩溃。
要修复此问题,您需要实际设置您的成员并删除int*
关键字:
pa = new int(*other.pa);
pb = new int(*other.pb);
不要使用原始指针,而是考虑使用std::unique_ptr
进行资源管理:
#include <memory>
class Pair {
public:
std::unique_ptr<int> pa, pb;
Pair(int a, int b)
{
pa = std::make_unique<int>(a);
pb = std::make_unique<int>(b);
}
};
int main() {
Pair p {1, 2};
return 0;
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误