1

プレースメント new 演算子を理解するための簡単なプログラムを試してみたところ、

#include<iostream>
#include<string.h>
using namespace std;

int main(){
        char *buf = new char[sizeof(string)];
        string *p = new (buf) string("hi");
        string *q = new string("bye");
        buf = (char*)"hello";
        cout << "buf :" << &buf << endl;
        cout << "p :" << p << endl;
        cout << "q :" << q << endl;
        cout << "buf :" << buf << endl;
        cout << "p :" << *p << endl;
        cout << "q :" << *q << endl;
        return 0;
}

バフが指しているアドレスを出力する方法は? &buff は、それが指しているアドレスではなく、ポインター buff のアドレスを提供します。

buff と q が同じメモリ位置を指しているかどうかを確認したかったのです。

また、コメントすると、buf = (char*)"hello";

buff は別のアドレスを指定しています。理解するのを手伝ってください。

4

3 に答える 3

1

アドレスを出力したい場合は、 にキャストしvoid*ます。例えば:

cout << "buf :" << (void*)buf << endl;

を出力しようとするとchar*、 のchar*オーバーロードoperator<<()が使用され、アドレスではなく C 文字列を出力しようとします。

于 2013-10-20T11:31:22.000 に答える
1

Astd::stringは単なるバッファーではありません。これには内部バッファーがあり、次のように を呼び出すことでアクセスできますc_str()

cout << "p :" << (void*)p->c_str() << endl;
cout << "q :" << (void*)q->c_str() << endl;

そうは言っても、あなたはbuf別のメモリ位置に再割り当てしていますが、それが何を意味するのか本当にわかっているかどうかはわかりません. たとえば、コードはオブジェクトを削除せず、メモリを解放しません。コードの最後に、おそらく次のようなものが必要です

delete q;
p->~string();
delete[] buf; // this needs to be the original pointer returned by new, not the modified one in your code!
于 2013-10-20T11:33:32.370 に答える
1

この行で

char *buf = new char[sizeof(string)];

コンピューターに文字の場所を設定するように依頼しますが、bufこれに値を設定しないため、出力はのアドレスになりbufます。この行で

buf = (char*)"hello";

予約されたメモリの内容をbuf文字列「hello」に設定したため、アドレスが表示されません。

于 2013-10-20T11:27:35.133 に答える