2

new我的问题是函数调用中使用运算符分配的对象会发生什么情况。

一个具体的例子:我有一个私有向量pV,我想将它发送到类之外的对象/函数,foo->func(std::vector<int> *vec). 我第一次尝试写

foo->func( new std::vector<int>(pV) )

但这会导致内存泄漏(当在循环内重复调用所述函数时)。当我专门创建一个新对象,调用该函数然后删除该对象时,整个事情都正常工作,没有内存泄漏。

新创建的对象不应该在函数返回时“过期”并被删除吗?如果不是,我应该如何从被调用函数内部删除对象?哪种方法更好?

4

3 回答 3

7

在 C++ 中没有新对象“过期”之类的东西:它不是垃圾收集或引用计数语言,因此您需要手动编写使用newor分配的对象的所有内存管理new[]

在这种特殊情况下,您可以使用unique_ptr来确保自动删除:

for (int i = 0 ; i != 10000 ; i++) {
    std::unique_ptr<std::vector<int> > tmp = new std::vector<int>(pV);
    foo->func(tmp);
}

这里没有魔法,即使看起来没有delete: 的调用delete是在内部显式编码unique_ptr的,因此出于所有实际目的,它仍然是手动的。

更好的解决方案是在自动存储中分配您的向量,并将指针传递给foo->func

for (int i = 0 ; i != 10000 ; i++) {
    std::vector<int> tmp(pV);
    foo->func(&tmp);
}
于 2012-05-08T16:23:08.810 回答
2

我认为最好的方法都不是。简单地通过pV自己。它将被复制(由复制构造函数),因此无论如何都会创建一个新向量。它会在函数返回时自动销毁。

于 2012-05-08T16:24:35.593 回答
2

用 分配的对象new最终必须用 释放delete,否则会有泄漏。分配与new函数调用无关 - 您可以在一个函数中创建某些内容并new在另一个函数中释放它delete而不会出现问题。

如果您想要一个在函数中分配并在函数退出时释放的对象,只需执行以下操作:

void foo(...) {
    // some code

    MyClass myobj(...); // object allocated here
    // some more code
    return; // object freed here (or whenever function exits)
}

如果您需要将指向对象的指针传递给函数,则也不需要使用new它;您可以使用&运算符:

std::vector<int> myvec(pV);
foo->func(&myvec);

在这种情况下myobj是一个自动变量,它被放置在堆栈上并在函数退出时自动删除。new在这种情况下无需使用。

于 2012-05-08T16:26:43.537 回答