new
delete
. , . , ++ new
delete
.new
delete
. , . , .delete
;new
make
-;new
.new
delete
STL boost.new
delete
?new
delete
++ .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
( , memory leak).delete
( ).delete
( , double delete).delete
delete[]
( , undefined behavior).delete
(dangling pointer).delete
, . new
, , , , . , make
-.new
delete
. , , , new
delete
.new
delete
: new[]
delete[]
. , :void DoWork(int* buffer, size_t bufSize);
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
.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
-:std::make_shared
:make
-:deleter
. , .. make
- new
.braced initializer
, , perfect forwarding (. Effective Modern C++, Item 30).std::make_shared
:std::weak_pointer
).new
delete
.delete
, make
- new
. , new
, delete
.make
- (a.k.a. STL). Don’t Help the Compiler:new
delete
. - , - .osg::Referenced
, . ref()
, unref()
, .osg::ref_ptr<T>
, T::ref()
T::unref()
. boost::intrusive_ptr
, ref()
unref()
.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
.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
.QObject
. , . ( ) .new
delete
. , . , (. Qt mailing list).std::locale::facet
std::locale
. (facet), . , .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
. .make
- , .new
delete
. , , , .Source: https://habr.com/ru/post/283352/
All Articles