?文章來源:http://www.zghlxwxcb.cn/news/detail-800610.html
在 C++ 中,new?操作符、::operator new?和 placement new 是用于動(dòng)態(tài)內(nèi)存分配的工具,但它們有不同的用法和行為。以下是它們的區(qū)別和用法的詳細(xì)實(shí)例:
1.new操作符
new?操作符用于在堆上動(dòng)態(tài)分配內(nèi)存,并調(diào)用對(duì)象的構(gòu)造函數(shù)初始化對(duì)象。
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass 構(gòu)造函數(shù)" << std::endl;
}
~MyClass() {
std::cout << "MyClass 析構(gòu)函數(shù)" << std::endl;
}
};
int main() {
// 使用 new 操作符動(dòng)態(tài)分配一個(gè) MyClass 對(duì)象
MyClass* myObject = new MyClass();
// 使用完后需要手動(dòng)釋放內(nèi)存
delete myObject;
return 0;
}
2.::operator new
::operator new?是 C++ 中的全局函數(shù),用于分配內(nèi)存,但不會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)。它返回分配的內(nèi)存的指針。
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass 構(gòu)造函數(shù)" << std::endl;
}
~MyClass() {
std::cout << "MyClass 析構(gòu)函數(shù)" << std::endl;
}
};
int main() {
// 使用 ::operator new 分配內(nèi)存
void* rawMemory = ::operator new(sizeof(MyClass));
// 在已分配的內(nèi)存上調(diào)用構(gòu)造函數(shù)
MyClass* myObject = new (rawMemory) MyClass();
// 使用完后手動(dòng)調(diào)用析構(gòu)函數(shù)
myObject->~MyClass();
// 釋放內(nèi)存
::operator delete(rawMemory);
return 0;
}
3. Placement new
Placement new 是使用 new 操作符的變種,允許在預(yù)分配的內(nèi)存上調(diào)用構(gòu)造函數(shù),類似于?::operator new?的用法。
#include <iostream>
class MyClass {
public:
MyClass() {
std::cout << "MyClass 構(gòu)造函數(shù)" << std::endl;
}
~MyClass() {
std::cout << "MyClass 析構(gòu)函數(shù)" << std::endl;
}
};
int main() {
// 預(yù)分配內(nèi)存
char buffer[sizeof(MyClass)];
// 使用 placement new 在預(yù)分配的內(nèi)存上調(diào)用構(gòu)造函數(shù)
MyClass* myObject = new (buffer) MyClass();
// 使用完后手動(dòng)調(diào)用析構(gòu)函數(shù)
myObject->~MyClass();
return 0;
}
區(qū)別總結(jié):
- new?操作符:
- 動(dòng)態(tài)分配內(nèi)存,并調(diào)用對(duì)象的構(gòu)造函數(shù)。
- 使用?delete?釋放內(nèi)存,并調(diào)用對(duì)象的析構(gòu)函數(shù)。
- ::operator new:
- 只分配內(nèi)存,不調(diào)用對(duì)象的構(gòu)造函數(shù)。
- 使用?::operator delete?釋放內(nèi)存,不調(diào)用對(duì)象的析構(gòu)函數(shù)。
- Placement new:
- 使用 new 操作符的變種,在指定的內(nèi)存位置調(diào)用構(gòu)造函數(shù)。
- 需要手動(dòng)調(diào)用析構(gòu)函數(shù),并在適當(dāng)時(shí)機(jī)釋放內(nèi)存。
選擇使用哪種方式取決于具體的需求,例如是否需要構(gòu)造和析構(gòu)函數(shù)的調(diào)用,是否需要手動(dòng)管理內(nèi)存釋放等。
?
文章來源地址http://www.zghlxwxcb.cn/news/detail-800610.html
到了這里,關(guān)于C++內(nèi)存分配揭秘:new操作符::operator new和Placement new的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!