代码之家  ›  专栏  ›  技术社区  ›  Giffyguy

如何判断指针/地址是否是动态分配的?

  •  0
  • Giffyguy  · 技术社区  · 3 年前

    我正在努力减少内存泄漏。
    显然,最好的解决方案是首先不要泄漏内存。

    但在我的例子中,我需要查看现有的指针,并确定是否有任何指针是动态分配的并且需要删除。

    给定一个特定的地址/指针,C++是否提供了一种确定给定地址指向堆的方法吗?

    奖金:
    C++是否提供了一种方法来确定是否需要删除给定堆地址 delete[] 与平原 delete

    1 回复  |  直到 3 年前
        1
  •  3
  •   Giffyguy    3 年前

    在C++(和C)中,指针指向任何地址。要知道所指向的内存类型,需要查看进程内存映射。这将是特定于平台的。

    /proc/<pid>/maps 文件包含此信息。

    但是,即使指针指向堆,如果它是新指针的增量(比如数组),或者如果它是使用 malloc 而不是 new .

        2
  •  2
  •   Galik    3 年前

    你应该使用智能指针。

    您无法知道指针指向何处,但使用智能指针意味着您可以避免删除 任何

    在代码中的某个位置创建智能指针,只要您需要使用它所指向的对象,它就会一直存在。然后,不要在代码周围传递智能指针(除非您需要转移/共享所有权),只需传递 参考 指向它所指向的对象(或原始指针)。

    当所有对象都由智能指针以这种方式管理时 从未 删除 代码中的任何指针,因为您知道有一个智能指针将在正确的时间处理删除操作。

    void func(Object const& o) { /* ... */ }
    void other_func(Object const* pp) { /* ... */ }
    
    // ... somewhere else in the codebade
    
    auto object_ptr = std::make_unique<Object>();
    
    func(*object_ptr); // call function with a reference
    
    other_func(object_ptr.get()); // call function with a raw pointer
    

    奖金:

    不。

    auto array_ptr = std::make_unique<Object[]>(25); // allocate an array
    
        3
  •  0
  •   Basile Starynkevitch    3 年前

    如何判断指针/地址是否是动态分配的?

    virtual address space 你的过程可能会改变。所以呢 ::operator new (或 malloc )通常实现为使用系统调用(在Linux上, mmap(2) sbrk(2) free -d存储器(或 ::operator delete -d一)。

    /proc/self/maps -看到了吗 proc(5)

    研究并实施 valgrind ,并注意 address sanitizer options of GCC .

    在C++中,你可以使用 smart pointers garbage collection handbook 解释了许多相关问题(一个主要问题是 circular references ,这将成为一个复杂的问题)。

    placement new

    在Linux上,您可以 dlopen(3) 许多插件,这也增加了复杂性,但非常有用(请参阅 Qt RefPerSys 作为例子,阅读 C++ dlopen minihowto