新規および削除なしのC ++

, !



, Align Technology. ++.



, . , ++ . , — .



. new



delete



. , . , ++ new



delete



.



, , . , . , .



, , - .









behappy.me



: new



delete



. , . , .



:



, new



delete



STL boost.



new



delete



?



new



delete



++ .



, . , . thread-local , . . storage duration.



, . , , . .



. ( ). :

struct A
{
  std::string str;  //  ,     A (  
                    // ).    -   (*),   
                    //    std::string,       A. 
  // (*)      ,   Small String Optimization  
  //     .
};

void foo()
{
  std::vector<int> v;  //  ,      .
  v.push_back(10);  //   -   (),     
                    // ,        .

  A a;  //    ,      .

  A* pa = new A;  //  pa -  ,      ,
                  //        ,      .
  delete pa;  //    .

  auto upa =  //   upa -  ,      , 
    std::make_unique<A>();  //        ,    
                            //    .
}

      
      





, . , . upa->str



, .. — *upa



. .. / , .



/ , , .. , *). a



*pa



, , — .



++ new



, delete



. : , ! , . .



, , .




* , / . , .



new



delete



?



new



delete



. delete



:



, .



delete



, . new



, , , , . , make



-.



new



delete



. , , , new



delete



.



— .





— , . , , , , .



++ new



delete



: new[]



delete[]



. , :

void DoWork(int* buffer, size_t bufSize);

      
      





API *. , . , .. delete



, .

void Call(size_t n)
{
  int* p = new int[n];
  DoWork(p, n);
  delete[] p;  // !
}

      
      





, ++ std::vector



**. . , , . :

void Call(size_t n)
{
  std::vector<int> v(n);  // .
  DoWork(v.data(), v.size());
}

      
      





, delete



, +, .



new



delete



.
. , .




* ++ span<int>



. STL- , ( ).



** ++, , - : «! std::vector



(!) , int*



— . ! !». ++ Why C++ Sails When the Vasa Sank. , std::unique_ptr<int[]>



, dynarray



.





, - . , *, (. ). .



, - , : , , , - . , , — .



**, . , , . , .



, , Qt. , . , .. QObject



. , , boost::intrusive_ptr



.



, . . . , QObject



setParent()



children()



, boost::intrusive_ptr



intrusive_ptr_add_ref



intrusive_ptr_release



.



, , . , , , .



. , , new



delete



, — .




* : pimpl;



(, ).



** std::locale::facet



(. ).





. ++, , .



, , , . . ++ : std::shared_ptr



std::unique_ptr



. std::weak_ptr



, .. std::shared_ptr



.



std::auto_ptr



, ++ ++17. !



, .. . , std::make_shared



std::make_unique



, .



.. :

std::unique_ptr<Cookie> cookie(new Cookie(dough, sugar, cinnamon));

      
      





:

auto cookie = std::make_unique<Cookie>(dough, sugar, cinnamon);

      
      





make



- GotW #89 Effective Modern C++, Item 21. , :



make- , :



. , delete



, make



- new



. , new



, delete



.




, make



- (a.k.a. STL). Don’t Help the Compiler:









. , (reference counting) - (parent to child relationship).



new



delete



. - , - .







, . OpenSceneGraph. 3D-, ++ OpenGL.



osg::Referenced



, . ref()



, unref()



, .



osg::ref_ptr<T>



, T::ref()



T::unref()



. boost::intrusive_ptr



, ref()



unref()



.



, OpenSceneGraph 3.0: Beginner's guide:

osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
// ... 
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array;
// ... 
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(vertices.get());
geom->setNormalArray(normals.get());
// ... 

      
      





osg::ref_ptr<T> p = new T



. , std::make_unique



std::make_shared



std::unique_ptr



std::shared_ptr



, osg::make_ref



osg::ref_ptr



. , std::make_unique



:

namespace osg
{
  template<typename T, typename... Args>
  osg::ref_ptr<T> make_ref(Args&&... args)
  {
    return new T(std::forward<Args>(args)...);
  }
}

      
      





:

auto vertices = osg::make_ref<osg::Vec3Array>();  
// ... 
auto normals = osg::make_ref<osg::Vec3Array>();  
// ... 
auto geom = osg::make_ref<osg::Geometry>();
geom->setVertexArray(vertices.get());
geom->setNormalArray(normals.get());
// ... 

      
      





. *, .



delete



osg::Referenced::unref()



, new



osg::make_ref



. new



delete



.





* , , .



MFC





, MFC. ++ Windows API. GUI Windows.



, Microsoft . .. , , . CDialog::PostNcDestroy()



. WM_NCDESTROY



— , .



CMainFrame::OnBnClickedCreate()



CMyDialog::PostNcDestroy()



.

void CMainFrame::OnBnClickedCreate()
{
  auto* pDialog = new CMyDialog(this);
  pDialog->ShowWindow(SW_SHOW);
}

class CMyDialog : public CDialog
{
public:
  CMyDialog(CWnd* pParent)
  {
    Create(IDD_MY_DIALOG, pParent);
  }

protected:
  void PostNcDestroy() override
  {
    CDialog::PostNcDestroy();
    delete this;
  }
};

      
      





new



, delete



. — . , PostNcDestroy()



, . new



, delete



, . , .



new



delete



CModelessDialog



CreateModelessDialog



, :

class CModelessDialog : public CDialog
{
public:
  CModelessDialog(UINT nIDTemplate, CWnd* pParent)
  {
    Create(nIDTemplate, pParent);
  }

protected:
  void PostNcDestroy() override
  {
    CDialog::PostNcDestroy();
    delete this;
  }
};

//     
template<class Derived, typename... Args>
Derived* CreateModelessDialog(Args&&... args)
{
  //  static_assert   ,   std::enable_if   ,     SFINAE. 
  //  ..       ,        .
  static_assert(std::is_base_of<CModelessDialog, Derived>::value, 
                "CreateModelessDialog should be called for descendants of CModelessDialog");
  auto* pDialog = new Derived(std::forward<Args>(args)...);
  pDialog->ShowWindow(SW_SHOW);
  return pDialog;
}

      
      





PostNcDestroy()



, delete



, , new



. :

void CMainFrame::OnBnClickedCreate()
{
  CreateModelessDialog<CMyDialog>(this);
}

class CMyDialog : public CModelessDialog
{
public:
  CMyDialog(CWnd* pParent) : CModelessDialog(IDD_MY_DIALOG, pParent) {}
};

      
      





, . , . , . CModelessDialog



. , , CMyDialog



, , . .



, . new



delete



.




-





, GUI. Qt — UI.



QObject



. , . ( ) .



, new



delete



. , . , (. Qt mailing list).



, new delete Qt.



std::locale::facet







++ std::locale



. (facet), . , .



, , , new (. Notes std::locale)



:

std::locale default;
std::locale myLocale(default, new std::codecvt_utf8<wchar_t>);

      
      





.



, , new



. , , .






, , . new



delete



make



- .



, , new



delete



. , .



, , . , , new



delete



, , . , , .



:





- new



delete



. , , , .



, , , .



C++ Russia. : , , , . , , , , , , .



PS , , : «» «». , «», . , «». , : «». -. , «», .





  1. Herb Sutter, GotW #89 Solution: Smart Pointers.
  2. Scott Meyers, Effective Modern C++, Item 21, p. 139.
  3. Stephan T. Lavavej, Don’t Help the Compiler.
  4. Bjarne Stroustrup, The C++ Programming Language, 11.2.1, p. 281.
  5. Five Popular Myths about C++., Part 2
  6. Mikhail Matrosov, C++ without new and delete.



All Articles