【发布时间】:2014-09-20 22:23:27
【问题描述】:
问题差不多就是这样。在 C++ 中,如果指针不是 NULL,是否有任何方法可以确定指向的数据是在堆上分配(new 类型分配)还是在堆栈上分配(典型分配和当前作用域生存期)。
我有一个智能指针和数组的实现(我知道智能指针存在于 C++11 中,但我避免使用它们,直到有比目前更简洁的方法来添加智能数组),其中我跟踪引用计数等.每当指针不再被引用时,它就会被删除。问题是,当前的实现并没有阻止给类一个指向堆栈上变量的指针(我不想强制通过智能指针创建指针,我有特定的情况我想做自己分配,例如在函数中创建数组时,在同一个函数中需要调整大小,然后再交给调用者等等),但如果我给出这样的指针,类将尝试调用delete或 delete[] 在此指针上,这将导致未定义的行为(老实说,在大多数情况下会崩溃)。
那么有没有办法检查我是否应该在销毁时删除这个指针,或者该类是否应该首先接受它?
提前谢谢大家。
【问题讨论】:
-
没有通用/便携的解决方案来检测这个。我不明白你为什么不使用标准智能指针......
-
标准 C++11 智能指针没有直接数组等效项,您需要提供自定义删除器(不记得如何执行此操作,因为解决方案不太优雅)。由于该算法非常基本且远离 CPU 密集型,我现在坚持我的实现;)顺便感谢您提供的信息!
-
@DevilBlackDeath C++11 有
std::array和std::vector,具体取决于您需要堆栈还是堆分配。 -
@MarkB 但是 std::vector 不允许我像智能数组一样管理分配的生命周期,这就是我使用两者的原因;)对于需要在退出当前范围时被释放我使用 std::vector 但为了更精细的生命周期我将使用智能数组(例如,当我管理我的 SFML 纹理时就是这种情况;))