我有一个方法,我的自定义对象作为参数:
void processObject(Myobject instance)
{
//some code using instance
}
我从另一种方法调用上面的方法:
...
processObject(*new MyObject());
...
这会导致内存泄漏吗?我应该在我的流程对象方法中调用delete& instance之类的东西吗?
非常感谢你的帮助!
修改
好吧,现在我知道有内存泄漏,你会建议什么是解决这个问题的最简单方法?我的想法是改变这段代码:
void processObject(Myobject* instance)
{
//some code using instance
delete instance;
}
...
processObject(new MyObject());
...
我需要尽可能简单快捷地解决这个问题(许多地方的代码中都存在同样的问题)。
答案 0 :(得分:2)
您无法删除processObject
过程收到的实例对象,因为它是您使用new
创建的对象的副本。想象一下:
new
创建新对象,这会在堆上创建对象并为您提供MyObject*
MyObject
类型的对象。在这里你也失去了指针,因为你不会把它存放在任何地方processObject
方法,并且当该函数的签名声明时,会创建对象的副本并将其传递给函数当你丢失指针时,你不能再删除了它。
解决方案不是使用new
分配对象并将参考传递给流程方法:
void processObject(MyObject& ref) {
// do something with the reference
}
void test() {
MyObject x;
processObject(x);
// do stuff with x
}
或者使用new
进行分配并执行此操作:
void processObject(MyObject* ptr) {
// do something with the pointer
}
void test() {
MyObject* x = new MyObject();
processObject(x);
// do stuff with x
delete x;
}
答案 1 :(得分:0)
是的,你应该删除一个新的,但你不能删除这个新创建的对象。
每当您编写*new x;
时,您都会取消引用指向实际引用(或对象)的指针。
在您的情况下,Myobject按值传递并因此被复制,使您的指针不在堆栈空间内,从而导致内存泄漏。
我建议您使用以下调用程序,效果几乎相同:(没有内存泄漏):
processObject(MyObject());
我认为您可能已经从Java获得了新语法,我们不得不使用它。在C ++中,您可以像这样隐式调用构造函数,并在适当的位置构造一个新对象,然后将其作为函数参数传递。
在这种情况下,对象在堆栈上构建,因此具有自动存储持续时间(没有内存泄漏)。
答案 2 :(得分:0)
目前它会记忆泄漏。您可以通过获取地址(但签名
)来删除processObject
函数内的对象
void processObject(Myobject instance)
不会阻止某人传递局部变量/堆栈对象。
Myobject instance;
processObject(instance);
如果发生这种情况,您无法delete
该对象。
避免使用原始指针,并避免混淆功能的用户。
答案 3 :(得分:0)
尝试:
class MyObject
{
public:
MyObject() { std::cout << "Reporting construction of object (ptr: " << (int)this << ")\n"; }
MyObject(const MyObject & other) { std::cout << "Reporting copy-construction of object (ptr: " << (int)this << ")\n"; }
MyObject(MyObject && other) { std::cout << "Reporting move-construction of object (ptr: " << (int)this << ")\n"; }
virtual ~MyObject() { std::cout << "Reporting destruction of object (ptr: " << (int)this << ")\n"; }
};
void DoSomething(MyObject obj)
{
}
int main()
{
DoSomething(*new MyObject());
}
结果:
Reporting construction of object (ptr: 140173320)
Reporting copy-construction of object (ptr: -1078250292)
Reporting destruction of object (ptr: -1078250292)
如您所见,第一个实例未被破坏 - 因此泄露。