1

私はこの問題を抱えています:

void myFunc()
{
  MyClass * myInstance = NULL;

  newInstance(myInstance);
}

void newInstance(MyClass * instance)
{
  instance = new MyClass(...);
}

コードは正常に動作しているようですが、newInstance 関数を終了すると、myInstance は null であり、newInstance 内にある値ではありません...どこに問題がありますか?t

ありがとう

4

2 に答える 2

9

ポインターがコピーされnewInstance、そのコピーの値を変更します。関数内のポインターを変更する場合は、参照渡しする必要があります。

void newInstance(MyClass*& instance)
{
  instance = new MyClass(...);
}

または、 a を渡してMyClass**を実行することもできます*instance = new Class(...);

どちらにしても、ポインタを変更可能な引数として渡すのではなく、実際にポインタを返す方が望ましいでしょう。

void myFunc()
{
  MyClass * myInstance = newInstance();
  delete myInstance;
}

MyClass* newInstance()
{
  return new MyClass(...);
}

もちろん、deleteオブジェクトを覚えておく必要があります。これを回避するには、スマート ポインターを使用してより安全にすることができます。

void myFunc()
{
  auto myInstance = newInstance();
}

std::unique_ptr<MyClass> newInstance()
{
  return std::unique_ptr<MyClass>(new MyClass(...));
}
于 2012-12-18T15:18:15.307 に答える
2

参照をポインターに渡すか、関数からポインターを返す必要があります。

void newInstance(MyClass*& instance)
{
  instance = new MyClass(...);
}

MyClass* newInstance()
{
  return new MyClass(...);
}

しかし、動的に割り当てられたメモリへの生のポインターを扱いたくありません。本当に必要なのは、ここでスマート ポインター、特にstd::unique_ptrを使用することです。

于 2012-12-18T15:19:52.987 に答える