作用域指针和重置

时间:2018-11-29 15:48:57

标签: c++ boost scoped-ptr

我正在使用boost作用域指针,但我不理解这种行为:

#include <iostream>
#include <boost/scoped_ptr.hpp>

int main()
{

    boost::scoped_ptr<int> p{new int{1}};
    std::cout << &p << '\n';
    p.reset(new int {2});
    std::cout << &p << '\n';

    return 0;
}

我得到以下输出:

0x7fff5fbff650
0x7fff5fbff650

复位功能是否不能更改p指向的地址? 如果使用作用域数组而不是作用域指针并打印上面代码中第一个元素所指向的地址,就会出现这种情况。

3 个答案:

答案 0 :(得分:7)

这样做的时候

public class Foo
{
    static void PrintName()
    {
        string className = nameof(Foo);
        ...
    }
}

您得到的是$json = '{ "subject": "Meeting time", "start": { "dateTime": "2018-11-30T09:00:00", "timeZone": "Pacific Standard Time" }, "end": { "dateTime": "2018-11-30T10:30:00", "timeZone": "Pacific Standard Time" } }'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://graph.microsoft.com/v1.0/me/events"); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $json); //Post Fields curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $headers = [ 'Content-Type: application/json', 'Content-Length: ' . strlen($json), 'Prefer: outlook.timezone="Pacific Standard Time"', "Content-Type: application/json", "Authorization: Bearer XXXXXXXXX...XXXXXXX" ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $server_output = curl_exec ($ch); curl_close ($ch); 的地址,而不是std::cout << &p << '\n'; 指向的地址。为此,您需要

p

在此示例中,实际上并不需要p,因为它会打印指针,除了std::cout << static_cast<void*>(p.get()) << '\n'; / static_cast<void*>()会给您地址外,我只是为了安全起见添加了它。 / p>

答案 1 :(得分:5)

您正在使用名为scoped_ptr的{​​{1}}的地址。只有一个!

如果您打印的是p&*p(出于理智考虑,尽管首选p.get()),那么您将打印它当前指向的内容的地址< / em>。

此地址将始终更改,因为您在第一个对象被销毁之前(使用(void*)p.get()创建了第二个对象,并且对象无法共享地址。

但是,如果您首先完成了new,那么您可能会或可能不会看到此地址的更改,具体取决于.reset()的内幕。只要对象不共享仍存在的另一个对象的地址,它们就没有具有程序生命周期内唯一的地址!但是,实际上,即使这样,实际上,如果第二个动态分配的new与第一个相同的地址结束,我会感到惊讶。

答案 2 :(得分:0)

您要打印的对象p的地址为boost :: scoped_ptr。 您应该使用p.get()获取句柄对象的地址;