C ++使用* new创建对象

时间:2014-07-17 08:56:21

标签: c++ pointers memory memory-leaks delete-operator

我有一个方法,我的自定义对象作为参数:

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());

...

我需要尽可能简单快捷地解决这个问题(许多地方的代码中都存在同样的问题)。

4 个答案:

答案 0 :(得分:2)

您无法删除processObject过程收到的实例对象,因为它是您使用new创建的对象的副本。想象一下:

  1. 使用new创建新对象,这会在堆上创建对象并为您提供MyObject*
  2. 您取消引用指针,因此您有一个MyObject类型的对象。在这里你也失去了指针,因为你不会把它存放在任何地方
  3. 您将对象传递给processObject方法,并且当该函数的签名声明时,会创建对象的副本并将其传递给函数
  4. 当你丢失指针时,你不能再删除了它。

    解决方案不是使用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)

如您所见,第一个实例未被破坏 - 因此泄露。