c++ - 为什么这里没有内存泄漏

标签 c++ memory-leaks

我正在尝试回答 this问题,所以我决定创建以下简单的测试用例,以便 OP 可以自己查看内存泄漏。

#include<iostream>

class MyObject
{
public:
   MyObject(){std::cout << "creation of my object" << std::endl;}
   virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
};

void processMyObject(MyObject foo)
{
}

int main()
{
   processMyObject(*new MyObject());
   return 0;
}

我编译了它:

g++ test.cpp -o test

然后,我看到了意想不到的输出:

creation of my object
destruction of my object

我完全不知道这里发生了什么。谁能给我解释一下?

PS:我用的是g++ 4.6.3

最佳答案

由于您按值将对象传递给函数,因此会产生复制或移动复制构造。但是您没有使用原始内存泄漏检查器来跟踪它。你可以提供你自己的复制构造函数,然后你会看到两个对象被创建,只有一个被销毁:

#include<iostream>

class MyObject
{
public:
  MyObject() {std::cout << "creation of my object" << std::endl;}
  MyObject(const MyObject&) {std::cout << "copy creation of my object" << std::endl;}
  ~MyObject() {std::cout << "destruction of my object" << std::endl;}
};

void processMyObject(MyObject foo) {}

int main() 
{
  processMyObject(*new MyObject());
}

输出:

creation of my object
copy creation of my object
destruction of my object

关于c++ - 为什么这里没有内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799951/

相关文章:

c++ - C++ 中的 Variadic 宏未按预期工作

c# - 为什么这种明显的无限递归不给出编译器警告?

c++ - 4维隐藏表面去除

java - 内存泄漏使用 JNI 将数组从 C++ 发送到 Java

c - 双向链表中的内存泄漏

c++ - 在编译时构建开关

c++ - 在 FOR 循环中声明变量

c++ - Objective-C 到 C++ 字符串转换导致内存泄漏

java - Android React Native ReactRootView 应该使用 Activity 还是 Application context?

java - 对单例封闭实例有隐式引用的匿名类实例会导致内存泄漏吗?