簡體   English   中英

放置新運算符的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM