函数调用中的new运算符

Joh*_*n S 2 c++ new-operator

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

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

foo->func( new std::vector<int>(pV) )
Run Code Online (Sandbox Code Playgroud)

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

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

das*_*ght 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);
}
Run Code Online (Sandbox Code Playgroud)

这里没有什么神奇之处,即使它看起来不像是delete:调用delete是在内部明确编码的unique_ptr,所以出于所有实际目的,它仍然是手动的.

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

for (int i = 0 ; i != 10000 ; i++) {
    std::vector<int> tmp(pV);
    foo->func(&tmp);
}
Run Code Online (Sandbox Code Playgroud)