我尝试了一个简单的程序来理解贴片新操作符
#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指向的地址? &amp; buff将给出指针buff的地址,而不是它指向的地址。
我想检查buff和q是否指向相同的内存位置。
此外,如果我发表评论, buf =(char *)“hello”;
buff给出了不同的地址。请帮助理解。
答案 0 :(得分:1)
在这一行
char *buf = new char[sizeof(string)];
您要求计算机为char buf
设置一个位置,但是您没有为此设置任何值,因此输出是buf
的地址。在这一行
buf = (char*)"hello";
您将为buf
保留的内存的内容设置为字符串“hello”,这就是您没有看到地址的原因。
答案 1 :(得分:1)
如果您要打印地址,请转发至void*
。例如:
cout << "buf :" << (void*)buf << endl;
如果您只是尝试打印char*
,则会使用char*
的{{1}}重载,它会尝试打印C字符串,而不是地址。
答案 2 :(得分:1)
std::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!