c++ - 唯一指针是否在堆或堆栈上分配内存?

标签 c++

我是 C++ 的新手。我在我的 PC 上测试了一个唯一指针:我认为它会分配在堆上,但它显示在堆栈上。这让我很困惑。唯一指针是否在堆或堆栈上分配内存?

    #include <memory>
    #include <stdio.h>

    void RawPointer()
    {
        int *raw = new int;// create a raw pointer on the heap
        printf("raw address: %p\n", raw);
        *raw = 1; // assign a value
        delete raw; // delete the resource again
    }

    void UniquePointer()
    {
        std::unique_ptr<int> unique(new int);// create a unique pointer on the stack
        *unique = 2; // assign a value
        // delete is not neccessary
        printf("unique pointer address: %p\n", &unique); 
    }

    int main(){
        RawPointer();
        UniquePointer();
    }

它有外壳:

    raw address: 0x555cd7435e70
    unique pointer address: 0x7ffcd17f38b0

谢谢兄弟,

最佳答案

您在 UniquePointer 函数中打印的是 std::unique_ptr 类对象 的地址。此类有一个内部成员,它是分配数据的实际地址。

您可以使用 get() 访问此实际 地址成员函数,如下面的代码所示(当我尝试时,它为我提供了与原始指针完全相同的地址 - 尽管情况并非总是如此):

void UniquePointer()
{
    std::unique_ptr<int> unique(new int);// create a unique pointer on the stack
    *unique = 2; // assign a value
    // delete is not neccessary
 // printf("unique pointer address: %p\n", &unique);
    printf("unique pointer address: %p\n", unique.get());
}

注意:%p 格式说明符需要一个 void * 指针作为参数;然而,隐式转换 void 指针(从指针到另一种类型)是明确定义的行为 - 参见此处:void pointers: difference between C and C++ .

随时要求进一步澄清和/或解释。

关于c++ - 唯一指针是否在堆或堆栈上分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61834575/

相关文章:

c++ - 从 C++ 内部获取损坏的符号名称

c++ - 模板调用彼此的功能

c++ - operator<<() 由于继承而无法从模板解析

C++ unsigned long 在 4294967295 之后不回绕

c++ - 如何使用 glReadPixels() 从 FBO 返回调整大小的图像?

c++ - std::exception 使用来自本地对象的消息

C++ 从周数和星期几获取 ISO8601 天数

C++类构造函数()

c++ - 结构中的 "pointer being freed was not allocated"

c++ - Qt 中奇怪的光标行为