C++分離了內存分配和對象生存期的概念。與C相比,這可能是該語言最重要的「新」方面之一。在C中,沒有這種區別,因爲變量完全由其內存決定,而在C++中,對象具有更抽象的「狀態」概念,與基礎內存不同。
讓我們看看內存第一:
{
char buf[100]; // automatic allocation, scoped lifetime
}
{
void * p = std::malloc(100); // dynamic allocation, manually managed
void * q = ::operator new(100); // essentially identical
// ...
::operator delete(q); // manual deallocation
std::free(p); // ditto
}
在另一方面,對象的一生是一個單獨的話題:
{
Foo x; // automatic storage, scoped lifetime.
// Implies automatic memory allocation for sizeof(Foo) bytes.
}
{
Foo * px = ::new Foo; // dynamic storage, manual lifetime,
// implies dynamic allocation via ::operator new()
Foo * py = ::new (q) Foo; // dynamic storage and manual lifetime, uses memory at q
// ...
delete px; // destroy object _and_ deallocate memory
py->~Foo(); // destroy object. Memory was never our business to start with.
}
正如你可以看到,內存的分離並且對象的生命週期增加了很多靈活性:我們可以讓動態對象生活在自動內存中,或者自己負責分配並重復使用內存來重複構建對象。標準new
和delete
表達式結合了分配和構造,但這只是最常用操作的捷徑。原則上,你完全可以自由處理內存和對象的生命週期。
該想法支持分配器的概念,這是C++標準庫中的核心概念。
也就是說**安置新** –
你正在做新的佈局,所以要重複使用'了'的內存來代替對了進去。 –
它不是真正的動態,因爲你必須使用的最大空間是'sizeof(int)' – James