簡體   English   中英

使用placement new作為多態unique_ptr

[英]Using placement new for a polymorphic unique_ptr

我讀過這篇關於使用placement new來重置boost::shared_ptr同時避免額外的內存分配的文章,並假設對於std::unique_ptr可以做同樣的,如果不相似的話? 我的問題是,當std::unique_ptr的類型為Base*並因此可以指向任何Derived* ,如果Derived類的大小不同, placement new是否會按預期工作? 這樣的事情可能是:

class Base
{
public:
  Base() {}
  virtual ~Base(){}
};

class Foo : public Base
{
public:
  Foo() : Base() {}
  virtual ~Foo(){}
  int a;
  int b;
};

class Bar : public Base
{
public:
  Bar() : Base() {}
  virtual ~Bar() {}
  int a;
};

int main()
{
  std::unique_ptr<Base> bp(new Bar());
  bp->~Base(); //edit: call destructor
  void* rawP = dynamic_cast<void*>(bp.release());//edit: cast to void*
  bp.reset(new(rawP) Foo()); 
  return 0;
}

這不會起作用。 Foo對象太大而不適合分配給Bar對象的內存。 如果你想讓bp指向一個Foo對象,你將不得不為一個對象分配足夠的空間。

Placement new在您已擁有的內存中構造一個對象。 確保內存足夠大以容納您正在構建的對象,這取決於您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM