为什么在删除对象之前调用拷贝构造函数?
我有以下类,其中包括一个复制构造函数:
头文件:Fred.h
namespace foo {
class Fred {
private:
int _x;
int _y;
public:
Fred(); // Default constructor
Fred(Fred const &other); // Copy constructor
Fred(int x, int y); // Regular parameters
~Fred(); // Destrcutor
};
}
实施文件:Fred.cpp
#include "Fred.h"
#include <iostream>
foo::Fred::Fred(){
_x = 0;
_y = 0;
std::cout << "Calling the default constructorn";
}
foo::Fred::Fred(Fred const &other){
_x = other._x;
_y = other._y;
std::cout << "Calling the copy constructor";
}
foo::Fred::Fred(int x, int y){
_x = x;
_y = y;
std::cout << "Calling the convenience constructorn";
}
foo::Fred::~Fred(){
std::cout << "Goodbye, cruel world!n";
}
当期望看到析构函数超出范围时调用它,而是调用复制构造函数,然后析构函数。 为什么创建了一个副本? 我是否在泄漏记忆?
using namespace foo;
int main(int argc, const char * argv[])
{
{
Fred f2 = *new Fred();
} // I was expecting to see a destructor call only
return 0;
}
这是因为你正在使用内存泄漏操作符*new
。
分配new
对象不会自动删除; 只有通过明确的使用delete
。 您的代码动态分配一个对象,将其复制到f2
,然后丢失指向动态对象的唯一指针。
如果你只是想创建一个本地对象:
Fred f2;
如果实际需要动态分配(换句话说,如果对象需要超出当前范围),则始终使用RAII对象(例如智能指针)以避免内存泄漏。 例如:
std::unique_ptr<Fred> f2(new Fred); // C++11 - no "delete" needed
auto f2 = std::make_unique<Fred>(); // C++14 - no "new" or "delete" needed
是的,代码泄漏内存: new Fred()
在堆上分配一个对象,但代码不会保存返回的指针,也不会删除该对象。
复制构造函数被调用的原因是f2
的创建复制了参数,就像它已被写入一样
Fred f2(*new Fred());
你可能想要写的是:
Fred f2 = Fred();
由于Fred
拥有用户定义的默认构造函数,因此可以将其缩短为:
Fred f2;
链接地址: http://www.djcxy.com/p/96541.html
上一篇: Why is the copy constructor being called before deleting the object?