如何在C ++中检索由new运算符分配的对象的地址?

时间:2014-03-22 13:20:26

标签: c++ string pointers memory new-operator

我是C ++的新手,我对new运营商的工作方式感到困惑。

我在堆上留出了一个对象的内存,如下所示:

string *myString = new string ("This is a string").

如果我想要这个对象的地址,我使用地址运算符,如下所示:

&myString

并接收myString的第一个字符的十六进制地址:0x28f3328

如果我使用没有地址运算符的对象名称:

myString

我得到一个不同的十六进制数作为回报(0x7a5380)。

第二个号码是多少?它是什么意思,还是仅仅是一些随机值?

5 个答案:

答案 0 :(得分:1)

你有一个对象指针string *myString;。当您获取地址(例如&myString)时,您无法获取对象的地址!你得到指向它的指针的地址。由于myString是一个指针,因此它已经 您对象的地址。

为了更清楚地说明这一点,请考虑以下事项:

string *myString = new string("...");
string *anotherPointer = myString;

在此代码中,myStringanotherPointer都指向同一个对象;这里只有一个对象。但是,如果您查看&myString&anotherPointer,您会看到这些指针位于不同的位置。

答案 1 :(得分:1)

这是指针地址与指针所指向的地址之间的区别。

std::string *myString = new std::string;

std::cout << &myString << std::endl; // prints the address of the myString pointer
std::cout << myString << std::endl; // prints the address of what myString points to

答案 2 :(得分:0)

*myString = new string ("This is a string").

这里myString本身就是指针,所以它保留了一些内存的地址,即它的值是地址。如果你&myString,你将获得myString的地址,因为指针在内存中也有一些地址。

答案 3 :(得分:0)

我认为你的意思是标准班std::string

对您提出的直接回复问题

  

如何检索由new运算符分配的对象的地址   C ++?

是operator new返回堆中分配的对象的地址。:)

在本声明中

std::string *myString = new std::string ("This is a string");

定义对象myString,其值为堆中分配的std::string类型的未命名对象的地址。

因此,使用表达式*myString可以直接访问未命名的对象。例如

std::cout << *myString << std::endl;

表达式&myString是对象myString本身的地址。它不是堆中分配的未命名对象的地址。

比较这两个陈述

std::cout << *myString << std::endl;

std::cout  << **&myString << std::endl;

他们给出相同的结果。但是,在第二个声明中,您必须应用两次operator *

答案 4 :(得分:0)

在可能的情况下始终使用具有自动存储持续时间的对象:

std::string myString("Some string");
std::string* ptrToString = &myString;    // initializing pointer with an address

请注意,您不太可能需要指向std::string对象的指针,干净的代码可能会使用引用处理它。


但是如果你真的动态地分配它,那么这一行:

std::string* ptrToString = new std::string("Some string");

创建一个对象(很可能在堆上)并将其地址分配给ptrToString,使其指向此内存。但是ptrToString本身是一个具有自动存储持续时间的变量,它是一个存储字符串地址的存储器。 &ptrToString产生一个存储器的地址,其中存储指针。