gpt4 book ai didi

c++ - 检查指针是否指向静态分配的对象?

转载 作者:行者123 更新时间:2023-11-28 02:07:43 29 4
gpt4 key购买 nike

我已经实现了一些 QObjects 的泄漏检测器。长话短说,在删除静态对象期间,我检查了哪些 QObject 没有被删除。但问题是一些 QObject 是静态分配的,所以我需要从泄漏报告中删除它们。有没有办法知道指针是否指向静态分配的对象?

最佳答案

据我所知,没有可移植的方法可以通过简单地了解变量的地址来了解变量使用的持续时间类型。但是,如果您所有的动态分配都使用 new,您可以使用自己的替换函数来实现 operator newoperator delete< 的不同签名,并使用它们来管理映射或一组所有分配。当前 C++ 标准草案 n4296 中的引用资料:

17.6.4.6 Replacement functions [replacement.functions]

...
A C++ program may provide the definition for any of twelve dynamic memory allocation function signatures declared in header <new> (3.7.4, 18.6):

  • operator new(std::size_t)
  • operator new(std::size_t, const std::nothrow_t&)
  • operator new
  • operator new[](std::size_t, const std::nothrow_t&)
  • operator delete(void*)
  • operator delete(void*, const std::nothrow_t&)
  • operator delete
  • operator delete[](void*, const std::nothrow_t&)
  • operator delete(void*, std::size_t)
  • operator delete(void*, std::size_t, const std::nothrow_t&)
  • operator delete[](void*, std::size_t)
  • operator delete[](void*, std::size_t, const std::nothrow_t&)

The program’s definitions are used instead of the default versions supplied by the implementation (18.6). Such replacement occurs prior to program startup (3.2, 3.6). The program’s declarations shall not be specified as inline. No diagnostic is required.

这将允许您构建一种手工制作 valgrind 并将例如存储在数组中 - 在 operator new 中使用标准容器可能很乏味,因为它们确实使用 operator new! - 已分配 block 列表。在简单的层面上,类似的东西可能会有所帮助:

// use a SZ value big enough for your program...
#define SZ 1000
struct Alloc {
void *p;
size_t size;
} alloc[SZ];

bool inited = false;

void * operator new(size_t s) {
void * p = malloc(s);
if (p != NULL) {
// fprintf(stderr, "Allocate %d at %p\n", s, p); // for debug
for (int i=0; i<SZ; i++) {
if (alloc[i].p == NULL) {
alloc[i].p = p;
alloc[i].size = s;
break;
}
}
}
return p;
}

void operator delete(void *p) {
size_t s = 0;
if (p != NULL) {
for (int i=0; i<SZ; i++) {
if (alloc[i].p == p) {
s = alloc[i].size;
alloc[i].p = NULL;
break;
}
}
free(p);
}
// fprintf(stderr,"De-allocate %p (%d)\n", p, s); // for debug
}

请注意,我故意使用 C stdio 函数来调试跟踪,以避免在 C++ 标准库 io 中调用 C++ 分配内存的任何可能性。

关于c++ - 检查指针是否指向静态分配的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36843514/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com