:您的复制构造函数正在创建两个指针,然后将它们泄漏出去。它从不设置类的成员变量。
您可能要参考三/五/等规则,为清楚起见, 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);
这将重新声明新的指针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;
}
本文链接:https://www.f2er.com/3169910.html