【问题标题】:placement new operator in c++ lang在 C++ 语言中放置新运算符
【发布时间】:2013-10-20 11:23:34
【问题描述】:

我尝试了一个简单的程序来理解placement 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 的地址,而不是它所指向的地址。

我想检查buff和q是否指向同一个内存位置。

另外,如果我评论,buf = (char*)"hello";

buff 给出了不同的地址。请帮助理解。

【问题讨论】:

  • cout

标签: c++


【解决方案1】:

如果要打印地址,请转换为 void*。例如:

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

如果您只是尝试打印char*,则会使用operator&lt;&lt;()char* 重载,它会尝试打印C 字符串,而不是地址。

【讨论】:

  • 谢谢,它适用于 buff,P 正在打印地址,*p 正在打印字符串。在 C 中 printf(%s,p) 将打印字符串。但是buff和P指向的地址不同。
  • Placement new 会将已分配的内存(指向 buff 的内存)分配给 P。为了检查这一点,我打印了 buff 和 P 中包含的地址。它们都是不同的
  • @Angus 您在打印其地址之前分配给buf,因此您得到一个不同的地址。注释掉buf 的分配,你应该得到bufp 的相同地址。
  • 谢谢尼科斯。我可以看到同一个地址,即 buf 和 p 指向的地址。
【解决方案2】:

在这一行

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

您要求计算机为字符 buf 设置一个位置,但您对此没有任何价值,因此输出是 buf 的地址。在这条线上

buf = (char*)"hello";

您将为buf 保留的内存内容设置为字符串“hello”,这就是您看不到地址的原因。

【讨论】:

    【解决方案3】:

    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!
    

    【讨论】:

    • p->c_str() 给出指针中包含的值。并且 &p->c_str() 给出了一个需要左值的错误。
    • @Angus Duh!我打算写点别的,看我编辑的答案。
    猜你喜欢
    • 2017-08-04
    • 2022-11-03
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多