c++ - 析构查询

标签 c++

我有下面这个程序,我通过引用函数 myFunc 传递一个 vector ,在这个函数中,我向 vector 添加了几个元素。

我没有释放用 new 创建的对象,现在忽略由此导致的内存泄漏。

myFunc() 执行完成后,我正在打印变量 ctor 和 dtor 知道构造函数和析构函数被调用了多少次。

输出是:

Before Exiting 5 7

我正在创建 5 个对象,所以 ctor5。但是为什么 dtor 7 呢?额外的两个从哪里算起?我错过了什么吗?

#include
#include
using namespace std;

static int ctor = 0;
static int dtor = 0;

class MyClass
{
public:
    MyClass(int n)
    {
        i = n;
        ctor++;
        // cout << "Myclass ctor " << ctor << endl; 
    } 

    ~MyClass()
    {
        dtor++; 
        // cout << "Myclass dtor" << dtor << endl;
    }

private: 
    int i;
}; 

void myFunc(vector<MyClass> &m);

void myFunc(vector<MyClass> &m)
{
    MyClass *mc;

    for(int i = 0; i < 5; i++)
    {
        mc = new MyClass(i);
        m.push_back(*mc);
    }
}

int main()
{

    vector<MyClass> m;
    vector<MyClass>::iterator it;

    myFunc(m);

    cout << "Before Exiting " << ctor << " " << dtor << endl;
}

最佳答案

vector 围绕对象进行复制,但只有您的 int 构造函数递增 ctor。这不考虑复制构造的对象,因为您没有提供,编译器会为您提供。

添加

MyClass(const MyClass& rhs) i(rhs.i) { ++ctor; }

到你的类(class)看看这是否平衡。

关于c++ - 析构查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287953/

相关文章:

c++ - 这个 'else' 是如何工作的?

c++ - C++中创建堆

c++ - 为什么 std::optional operator* 没有 has_value() 的 Debug模式断言?

c++ - 仅在 Havok SDK 中发生的链接器错误

c++ - CryptHashData 返回 ERROR_INVALID_PARAMETER (CAPI)

c++ - 二维区域的内存布局

c++ - 无法理解c语言宏中的inc/dec运算符行为

c++ - 在树中检查给定节点是否是另一个节点的祖先

c++ - 指向设备常量的 CUDA 指针

c++ - 我如何解决不允许模板化虚拟功能的问题