[英]Problems with the placement new operator
我理解placement new運算符允許在特定/特定的內存位置構造對象。 所以我嘗試了這個;
#include <iostream>
#include <new>
using namespace std;
struct Any {
int x;
string y;
};
int main() {
string mem1[1];
int mem2[5];
Any *p1 = new (mem1) Any;
Any *p2 = new (mem2) Any;
p1->y = "Hello";
//p2->x = 20;
cout << p1->y << endl;
//cout << p2->x;
return 0;
}
我意識到,我可以將一個字符串設置為一個位置,我已經預留了一個字符串,但是我不能為這樣的整數做同樣的事情。
int mem2[1];
Any *p2 = new (mem2) Any;
p2->x = 20;
我收到一個緩沖區溢出錯誤,即使它設法顯示我放置在該位置的值為20
;
為什么?
另外,使用上面顯示的完整代碼,我已經預留了2個不同的內存位置來保存2個對象,這使得p1->y
打印沒有任何問題。 但是當我減少這個位置
int mem2[5];
任何低於5
數字,我認為與我放置字符串的位置無關,並嘗試打印字符串,我得到分段錯誤錯誤。 為什么>= 5
? 它與內存有關嗎?
有沒有辦法檢查使用placement new運算符將對象放置在特定的內存位置是否成功?
您的代碼中有一組未定義的行為。 首先,不能保證聲明string mem[1];
留出足夠的內存來容納Any
類型的卑鄙....
其次,即使第一個有足夠的內存來容納這樣的對象,數組string mem[1];
的析構函數string mem[1];
仍然會在main的末尾運行,但是你已經用其他東西覆蓋了那個數組,因此你的程序應該在最好的情況下崩潰。
您可能希望使用POD類型(如char mem1[sizeof(Any)]
來存儲對象,這樣您就可以確定mem1
足以存儲Any
,並且您將調用mem1
析構函數沒有問題在main()
的末尾
同樣,您可能想要探索這種事物的標准設施, std::aligned_storage
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.