2012-08-07 86 views
2

只是想知道这是否是一个不好的做法。传递新对象到函数C++

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

新车()对象的生活应当不受happyFunction调用它后,以后应该摧毁 现在是确定的事情。我的意思是我不应该删除为该实例分配的内存?

示例使其更加清晰。

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

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

+8

你应该更好地阅读一些C++的书[在C++中,为什么要'new'的 – Andrew 2012-08-07 11:23:39

+1

可能重复尽可能少使用?](http://stackoverflow.com/questions/6500313/in-c-why-should-new-be-used-as-little-as-possible) – KillianDS 2012-08-07 11:25:34

+0

嗯,我想你需要更具体一点。我说一般来说这是不好的做法,但有时你可以在方便时做到这一点,无所谓。 – ygram 2012-08-07 11:29:28

回答

7
happyFunction(new Car()); 

在自己的实践中(虽然几乎肯定是错误的),内存可以在函数内部删除。但那会让人困惑,所以它不是最好的主意。

而且虽然它是安全的一个参数,如果是这样的

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

和消息一个接着抛出异常其他新执行时,就没有办法来释放内存,所以它不是安全。

你总是不得不自己用C++释放内存,所以你的第二个例子会导致大的内存泄漏。有类如的unique_ptr和shared_ptr的来帮助你管理它,而无需编写自己删除,你可以找到任何数量的教程在网上对他们

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 
    } 
    
+0

我意识到这有点旧,但我想问一下调用者是否仍然可以保留已分配对象的所有权,如果以OP描述的方式调用它的话。也就是说,如果他使用'happyFunction(new Car());',调用者仍然可以'删除'它吗?我问,因为你说'在#2中传递参考'会更好,这意味着存在替代(可能是原始方法)。 – Hydronium 2013-03-15 14:41:10

+0

在你的例子中,调用者没有_have_指向对象的指针(因为它从不将'new'的结果赋值给一个变量,它只发送给函数调用)。所以,调用者没有办法删除该对象。 – Useless 2013-03-15 17:36:24

+0

......这似乎很危险。编译器/ C++标准允许这样做是有原因的,因为它看起来应该是永远不应该做的事情? – Hydronium 2013-03-15 17:38:01