如何解决如何知道指针一被复制?
我有一个动态分配的内存指向一个指针。代码的某些部分将此指针复制到许多容器,但我不知道确切的容器。每当在任何容器中复制指针(即浅拷贝)时,是否有可能知道(可能通过注册回调或其他方式)?
如果有人可以建议通过添加一些代码或通过 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_ptr
和 std::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 举报,一经查实,本站将立刻删除。