4

我只是想知道这是否是一种不好的做法。

for(int i=0;i<1000;i++)
    happyFunction(new Car());

car()对象在调用它happyFunction之后应该存在,然后它应该被销毁。现在可以这样做了。我的意思是我不应该删除为该实例分配的内存吗?

示例使其更清楚。

int i = 0;
for (i=0;i<1000;i++){
    new car();
}

这是一个好习惯吗?我应该删除内存分配吗?我希望我的问题很清楚。谢谢你。

4

3 回答 3

7
happyFunction(new Car()); 

这本身并不是一个坏习惯(尽管几乎可以肯定是错误的),内存可以在函数内部被删除。但这会令人困惑,所以这真的不是最好的主意。

此外,虽然使用一个参数是安全的,但如果是这样的话

happyFunction(new Car(), new Thing()); 

并且其中一条消息在执行另一条新消息后引发了异常,无法释放内存,因此不安全。

您总是必须自己在 C++ 中释放内存,因此您的第二个示例会导致大量内存泄漏。有 unique_ptr 和 shared_ptr 等类来帮助您管理它,而无需自己编写删除,您可以在网上找到任意数量的关于它们的教程

于 2012-08-07T11:26:49.813 回答
2

有两种可能:

  1. happyFunction应该拥有指针的所有权,调用者从不担心它。在这种情况下,这样写会更明智

    void happyFunction(std::unique_ptr<Car> &&car)
    {
        // car is mine now, and is automatically destroyed when I return
        // unless I explicitly request otherwise
    }
    
    void caller()
    {
        happyFunction(std::unique_ptr<Car>(new Car));
        // the new Car is immediately handed over to the unique_ptr
        // and I don't have to worry about leaks
    }
    
  2. happyFunction只应该使用指针:调用者保留控制权和所有权。在这种情况下,最好传递一个引用,这样就不会有所有权转移的建议

    void happyFunction(Car &car)
    {
        // car is still owned by the caller,
        // I just get a reference to use in here
    }
    
    void automatic_caller()
    {
        Car car;
        happyFunction(car);
        // car is always owned by me, and is
        // automatically destroyed at the end of this scope
    }
    
    // alternatively (only if car should live longer than the enclosing scope)
    void dynamic_caller()
    {
        std::unique_ptr<Car> car(new Car);
        // or get pointer from somewhere else ...
        // or get shared_pointer, etc. etc.
        happyFunction(*car);
        // again car is destroyed here unless we do something special
    }
    
于 2012-08-07T11:38:59.967 回答
1

new Car()如果您返回指向happyFunction()new Car().

考虑以下代码:

#include <string>
#include <iostream>

using std::string;
using std::cout;

class Car
{
public:
    string s;
    Car(string str):s(str) {}
};

Car* happyFunction(Car *pCar)
{
    // do something with data pointed to by pCar
    return pCar;
};

int main()
{
    // outer pointer to memory allocated by new operator
    Car *pCar = happyFunction(new Car("test"));
    // pCar still points to valid object even after happyFunction() content
    // went out of scope
    cout << pCar->s << "\n";

    // release pCar memory outside the happyFunction()
    delete pCar;

    return 0;
}
于 2018-06-24T11:18:29.677 回答