导致SegFault C ++的析构函数

问题描述 投票:-2回答:4
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;
    }

};

在此程序中,编译器产生了分段错误(核心转储),在完全删除析构函数之后,我们能否使程序运行而没有任何错误,因此有人可以帮助我吗?即使在参数化的构造函数中,我也初始化了指针,编译器也发出警告,指出点和pb尚未初始化。

c++ heap destructor copy-constructor
4个回答
1
投票

对于您的复制构造函数,您应该(最有可能)这样做:

Pair(const Pair& other) {
    pa = new int(*other.pa);
    pb = new int(*other.pb);
}

这完成了复制构造函数的预期工作。

使用您的代码,当对通过其复制构造函数创建的Pair对象调用析构函数时,您正试图删除未初始化的指针。


1
投票
可能的问题(尽管很难用当前给出的代码来分辨)是这些行在这里:

1
投票
:您的复制构造函数正在创建两个指针,然后将它们泄漏出去。它从不设置类的成员变量。

0
投票
不是使用原始指针,而是考虑使用std::unique_ptr进行资源管理:
© www.soinside.com 2019 - 2024. All rights reserved.