为什么在删除对象之前调用拷贝构造函数?

我有以下类,其中包括一个复制构造函数:

头文件: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?

下一篇: C++ and when to use delete