微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何知道指针一被复制?

如何解决如何知道指针一被复制?

我有一个动态分配的内存指向一个指针。代码的某些部分将此指针复制到许多容器,但我不知道确切的容器。每当在任何容器中复制指针(即浅拷贝)时,是否有可能知道(可能通过注册回调或其他方式)?

如果有人可以建议通过添加一些代码或通过 Valgrind 来实现这一点。

代码

int *arr[1];
void func(int* p)
{
    arr[0] = p;
}

void PrintArray()
{
    cout<<arr[0]<<endl;    //This is a stale pointer
}

int main()
{
    int* p = new int(10);
    func(p);
    delete p;
    PrintArray();
    return 0;
}

在上面的代码中,'p'在main函数中分配了内存,这个指针被复制到了'func'函数中的数组中。现在在“PrintArray”中,我正在打印该数组,而其数据已被删除

这是一个简单的例子,其中知道容器是数组。所以我可以处理它,但在我的代码库中,它非常大,可能有很多容器,我有这样的指针,并访问那些给我带来问题的容器。我怎样才能找到那些容器,然后又跌跌撞撞地进入代码库?

解决方法

std::shared_ptrstd::weak_ptr 是您想要的:

#include <memory>
#include <cstdio>

int main() {
  auto pc = std::make_shared<char>('a');

  std::printf("use count = %zu\n",pc.use_count());

  auto pc2 = pc;

  std::printf("use count = %zu\n",pc.use_count());

  {
    auto pc3 = pc;
    std::printf("use count = %zu\n",pc.use_count());
  }

  std::printf("use count = %zu\n",pc.use_count());
}

输出:

use count = 1
use count = 2
use count = 3
use count = 2

它还将管理内存。如果您想要weak reference,还要注意std::weak_ptr

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。