2

私は次のプログラムを持っています -

#include <iostream>
#include <memory>

class Person
{
   public:
      Person(const std::string& name):
         name(name) { }

      ~Person() { std::cout << "Destroyed" << std::endl; }

      std::string name;
};

typedef struct _container
{
   std::unique_ptr<Person> ptr;
}CONTAINER;

void func()
{
   CONTAINER* c = static_cast<CONTAINER*>(malloc(sizeof(CONTAINER)));
   std::unique_ptr<Person> p(new Person("FooBar"));
   c->ptr = std::move(p);
   std::cout << c->ptr->name << std::endl;
}


int main()
{
   func();
   getchar();

   return 0;
}

プログラムは「FooBar」を出力します。func() が戻ったときにプログラムが「Destroyed」を出力することを期待していますが、そうではありません。この場合、なぜそれが起こらないのか、誰かが私を助けることができますか?

4

2 に答える 2

2

の最後にこの行を追加するのを忘れていfunc()ます。

delete c;

これがテスト(イデオン)です

c生のポインタです。これはスマート ポインターではありません。したがって、手動で削除する必要があります。

は一意のポインタであるため、削除cすると自動的に削除されます。CONTAINER::ptrCONTAINER::ptr

ただし、malloc自分自身がいる場合、より適切なコードは次のようになります:-

c->~_container();

その後、しかし、ヒープ上にないfree()ため、この場合は必要ないと思います。 (私は使ったことがないので、この部分についてはよくわかりません。)CONTAINER
malloc

編集:
私の解決策は、単一の問題を解決するための簡単なパッチです。(「Destroyed」と表示しないでください) Michael Anderson
の解決策 もお読みください。OPのコードの 別の根本的な問題に対処します。(マロック)

Edit2: これ は、 Michael Andersonが言及した新しい配置に関する良いリンクです。
以下のコードは、リンクからコピーされたものです (ほとんど変更されていません):-

int main(int argc, char* argv[]){
  const int NUMELEMENTS=20;
  char *pBuffer = new char[NUMELEMENTS*sizeof(A)];  
  //^^^ difference : your "CONTAINER" could be char[xxxx] (without new)
  A *pA = (A*)pBuffer;
  for(int i = 0; i < NUMELEMENTS; ++i) {
    pA[i] = new (pA + i) A();
  }
  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
  // dont forget to destroy!
  for(int i = 0; i < NUMELEMENTS; ++i){
    pA[i].~A();
  }  
  delete[] pBuffer;//<--- no need to delete char[] if it is a stack variable
  return 0;
}

詳細については、上記のリンクを参照してください (これ以上コピーしたくないため)。

別の便利なリンクを次に示します。C++ で malloc を使用することは、通常はお勧めしません。

于 2017-04-06T03:02:04.657 に答える