如何在 "modern" C++ 中 create/destroy 对象?

How to create/destroy objects in "modern" C++?

我正在将 C# 应用程序移植到 C++ linux 应用程序。我对“现代”(C++11?)中的构造和破坏感到困惑。我一直认为你必须使用 new/delete 但现在看来 C++ 推荐的是不要这样做(这是正确的还是我读错了博客?)。

我大概有什么(BBRecatm有6个子class:

class ARec : public BRec
class A : public B
. . .
class Factory
  BRec GetRecord(WrapperStruct s)
  {
    if(s.Type == 'A')
    {
      A* a = (A*)s.Data;
      auto rec = ARec((ushort)a->Num);
      rec.OtherField = a.OtherField;
      return rec;
    }
. . .
main

// separate pthread
void* Logger(void* arg) {

    int* thread_state = (int*)arg;

    auto f = Factory();

    WrapperStruct item;

    while (true)
    {
      q->try_dequeue(item);

      auto rec = f.GetRecord(item);
      auto bytes = f.GetBytes(rec);

      // write bytes to file ...

      delete bytes;

      if(*thread_state == -1)
        pthread_exit(0);
    }

问题 - 编译器如何知道何时删除工厂方法中的 s.Data?相同 - rec 如果它是在 class 方法中创建然后交叉到其他方法(while 在 Logger 中)?有没有关于如何在 C++11 中管理变量内存的简单指南?

编辑: s.Data 包含对在第 3 方 dll 中创建的对象的引用,并且可以是不同的类型,因此 s.Type

智能指针是关键。

 std::shared_ptr<Foo> foo = std::make_shared<Foo>();
 std::unique_ptr<Foo> bar = std::make_unique<Foo>();

可以复制共享指针。他们做引用计数。当引用计数降为零时,它们会自动删除它们的内容。

无法复制唯一指针。它们可以通过引用复制。当唯一指针超出引用范围时,它会为您释放对象。

所以它现在的工作方式很像 Java。

 void notAMemoryLeak() {
      std::shared_ptr<Foo> foo = std::make_shared<Foo>();
 }

除此之外,您将它们视为指针。此时它们使用的语法是相同的,除了你传递的是智能指针,而不是 Foo *.

 void myFunct(std::unique_ptr<Foo> &foo) {
      cout << "Foo: " << foo->getName() << "\n";
 }

make_sharedmake_unique 可以采用与任何 Foo 的构造函数相同的参数,因此请随意传递内容。

我再做一件事:

 class Foo {
 public:
      typedef std::shared_ptr<Foo> Pointer;
      ...
 };

 Foo::Pointer foo = std::make_shared<Foo>();

有时我也会创建静态方法来让它更干净。这是风格上的,不是必需的。有些人可能会指责我。但它干净且易于阅读。