导致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。

w513166440 回答:导致SegFault C ++的析构函数

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

您可能要参考三/五/等规则,为清楚起见, File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py",line 85,in manager_method return getattr(self.get_queryset(),name)(*args,**kwargs) File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py",line 1079,in _insert return query.get_compiler(using=using).execute_sql(return_id) File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py",line 1111,in execute_sql for sql,params in self.as_sql(): File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py",line 1064,in as_sql for obj in self.query.objs File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py",line 1013,in pre_save_val return field.pre_save(obj,add=True) File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py",line 296,in pre_save file.save(file.name,file.file,save=False) File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py",line 93,in save name = self.field.generate_filename(self.instance,name) File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py",line 330,in generate_filename filename = posixpath.join(dirname,filename) File "/usr/lib/python2.7/posixpath.py",line 75,in join if b.startswith('/'): AttributeError: 'file' object has no attribute 'startswith' 默认构造函数也不会受到损害。

delete
,

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

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);

这将重新声明新的指针pcpd,并且实际上并未设置成员变量papb。一旦构造函数退出,这些新的指针就会超出范围。最好的情况是潜在的内存泄漏,最坏的情况是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;
}
本文链接:https://www.f2er.com/3169910.html

大家都在问