函数调用中的new运算符

时间:2012-05-08 16:19:55

标签: c++ new-operator

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

在C ++中没有新对象“过期”:它不是垃圾收集或引用计数语言,因此您需要手动编写使用new分配的对象的所有内存管理或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);
}

答案 1 :(得分:2)

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

答案 2 :(得分: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