C++ 为什么这里没有内存泄漏
我试图回答这个问题,所以我决定创建以下简单的测试用例,以便OP能够自己看到内存泄漏C++ 为什么这里没有内存泄漏,c++,memory-leaks,C++,Memory Leaks,我试图回答这个问题,所以我决定创建以下简单的测试用例,以便OP能够自己看到内存泄漏 #include<iostream> class MyObject { public: MyObject(){std::cout << "creation of my object" << std::endl;} virtual ~MyObject(){std::cout << "destruction of my object" << s
#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;
}
然后,我看到了一个意外的输出:
creation of my object
destruction of my object
我完全不知道这里发生了什么。谁能给我解释一下吗
PS:我使用了g++4.6.3,因为您是按值获取MyObject 因此有一种破坏。但这是对
processMyObject
末尾的foo
参数的破坏
在这种情况下,*新的
实际上仍然会泄漏
编辑:正如juanchopanza所指出的,您还需要在复制构造函数和移动构造函数中打印语句。实际上存在内存泄漏。仅仅因为您的对象被销毁,并不意味着您删除了通过
new
获得的资源。您必须明确使用delete
编辑
下面是正在发生的事情:
processMyObject()
,使用编译器隐式定义的复制构造函数在该范围内创建一个新对象processMyObject()
中)超出范围时,将调用其析构函数,打印第二条消息希望这能把事情弄清楚。代码中发生了什么
- 构造一个对象并获取有关它的信息(
)创建我的对象
- 您将其传递给函数复制构造函数,但不报告任何内容
- 副本已销毁-您将获得有关它的信息(
)销毁我的对象
- 原始实例泄漏,尽管事实上,您没有关于它的任何信息
#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;
}
#包括
类MyObject
{
公众:
MyObject(){std::cout由于您通过值将对象传递给函数,因此会产生复制或移动复制构造。但您无法使用基本内存泄漏检查器跟踪该构造。您可以提供自己的复制构造函数,然后您将看到创建了两个对象,并且只销毁了一个:
#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());
}
内存泄漏。你也需要检测复制和移动复制构造函数。是的,但问题是为什么我们可以看到某些内容被删除?@doctorlove事实上,这是在评论中指出的。我编辑以提及它:)哦,现在我明白了。我有点不好意思自己找不到它。谢谢!@doctorlove我在打印指向此的指针以及构建/销毁报告是跟踪内存泄漏的一种简单而有效的方法:)
creation of my object (165437448)
destruction of my object (-1076708692)
#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;
}
class MyObject
{
public:
MyObject(){std::cout << "creation of my object" << std::endl;}
MyObject(const MyObject & obj) { std::cout << "copy-ctor" << std::endl; }
MyObject(MyObject && obj) { std::cout << "move-ctor" << std::endl; }
virtual ~MyObject(){std::cout << "destruction of my object" << std::endl;}
};
#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