4

これが悪い習慣であるかどうかを知りたいだけです。

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

新しいcar()オブジェクトは、から呼び出したhappyFunction後も存続する必要があり、後で破棄する必要があります。これでOKです。そのインスタンスに割り当てられたメモリを削除すべきではないということですか?

より明確にするための例。

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

これは良い習慣ですか?メモリ割り当てを削除する必要がありますか? 私の質問が明確であることを願っています。ありがとうございました。

4

3 に答える 3

7
happyFunction(new Car()); 

それ自体は悪い習慣ではありませんが (ほぼ間違いなく間違っています)、メモリは関数内で削除される可能性があります。しかし、それは混乱を招くため、実際には最良のアイデアではありません。

あとパラメータ一つでも安心ですが、こうだったら

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

そして、ニュースの 1 つが別の新しいニュースが実行された後に例外をスローしました。これはメモリを解放する方法がないため、安全ではありません。

C++ では常に自分でメモリを解放する必要があるため、2 番目の例では大きなメモリ リークが発生します。unique_ptr や shared_ptr などのクラスがあり、削除を自分で書かなくても管理できます。それらについては、オンラインでいくつでもチュートリアルを見つけることができます。

于 2012-08-07T11:26:49.813 に答える
2

次の 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 に答える