首页 > 解决方案 > 智能指针(shared_ptr)

问题描述

我尝试学习如何使用智能指针。我使用了很长一段时间的普通指针,我认为我需要升级一下我的技能。

我做了一些研究,我了解智能指针的某些方面,但我尝试在一个清晰的项目中实现以了解智能指针是如何工作的。我尝试:

#include <iostream>
#include <array>
#include <memory>

class Entity
{
public:
    Entity()
    {
        std::cout << "Entity called!" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Entity destroyed!" << std::endl;
    }
    void print() { std::cout << "Message!"; }
};

int main()
{
    std::shared_ptr<int>f1(new int[100]);

    f1.get()[1] = 1;
    std::cout << f1.get()[1];
}

一切都好,消息它的打印。但是当我尝试时:

#include <iostream>
#include <array>
#include <memory>

class Entity
{
public:
    Entity()
    {
        std::cout << "Entity called!" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Entity destroyed!" << std::endl;
    }
    void print() { std::cout << "Message!"; };
};

int main()
{
    std::shared_ptr<Entity>f1(new Entity[100]);

    f1.get()[1].print();
}

我收到此错误:[img] https://i.imgur.com/U30gTgC.png[/img]

下一个:

int main()
{
    std::shared_ptr<Entity>f1(new Entity[100]);

    (f1.get() + 1)->print();
}

同样的错误。

我尝试使用 std::make_shared:

#include <iostream>
#include <array>
#include <memory>

class Entity
{
public:
    Entity()
    {
        std::cout << "Entity called!" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Entity destroyed!" << std::endl;
    }
    void print() { std::cout << "Message!"; };
};

int main()
{
    std::shared_ptr<Entity>f1 = std::make_shared<Entity>();

    f1->print();
}

一切安好。

我尝试使用 int 分配 continue 内存:

#include <iostream>
#include <array>
#include <memory>

class Entity
{
public:
    Entity()
    {
        std::cout << "Entity called!" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Entity destroyed!" << std::endl;
    }
    void print() { std::cout << "Message!"; };
};

int main()
{
    std::shared_ptr<int>f1 = std::make_shared<int>(100);

    f1.get()[1] = 10;
    std::cout << f1.get()[1];
}

消息已打印,输出:10 但错误: https ://i.imgur.com/UPu7VZo.png

我尝试另一种方式:

int main()
{
    std::shared_ptr<int>f1 = std::make_shared<int>(100);

    *(f1.get() +1) = 10;
    std::cout << *(f1.get() + 1);
}

同样的错误。

std::shared_ptr<Entity[]>f1 = std::make_shared<Entity[]>(new Entity[100]);

我有错误...

我试图做这样的事情:

int main()
{
    Entity* f1 = new Entity[100];

    f1[0].print();
    f1[1].print();
    f1[2].print();

}

但我想使用智能指针。

对于 int,我想做一些这样的赋值:

int main()
{
    int* f1 = new int[100];

    f1[0] = 14;
    f1[1] = 20;
    f1[2] = 5;
}

我怎样才能用智能指针做这样的事情。我想使用: std::make_shared(new Entity[100]) 或类似的东西。

我可以尝试使用向量或数组之类的库,但我暂时不想使用这个库。我想暂时保持我的代码清晰。在我理解 100% 智能指针后,我将使用数组和向量库

标签: c++smart-pointers

解决方案


不是

std::shared_ptr<Entity[]> f1 = std::make_shared<Entity[]>(new Entity[100]);

std::shared_ptr<Entity[]> f1 = std::make_shared<Entity[]>(100);

甚至更简单

auto f1 = std::make_shared<Entity[]>(100);

使用make_shared时不应使用new. 的要点之一make_shared是更有效地分配内存,如果您使用new.

注意:数组形式make_shared需要C++20。


推荐阅读