在c ++ lang中放置new运算符

时间:2013-10-20 11:23:34

标签: c++

我尝试了一个简单的程序来理解贴片新操作符

#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给出了不同的地址。请帮助理解。

3 个答案:

答案 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!