【问题标题】:Can we determine if the data pointed was allocated manually or not? [duplicate]我们能否确定指向的数据是否是手动分配的? [复制]
【发布时间】:2014-09-20 22:23:27
【问题描述】:

问题差不多就是这样。在 C++ 中,如果指针不是 NULL,是否有任何方法可以确定指向的数据是在堆上分配(new 类型分配)还是在堆栈上分配(典型分配和当前作用域生存期)。

我有一个智能指针和数组的实现(我知道智能指针存在于 C++11 中,但我避免使用它们,直到有比目前更简洁的方法来添加智能数组),其中我跟踪引用计数等.每当指针不再被引用时,它就会被删除。问题是,当前的实现并没有阻止给类一个指向堆栈上变量的指针(我不想强制通过智能指针创建指针,我有特定的情况我想做自己分配,例如在函数中创建数组时,在同一个函数中需要调整大小,然后再交给调用者等等),但如果我给出这样的指针,类将尝试调用deletedelete[] 在此指针上,这将导致未定义的行为(老实说,在大多数情况下会崩溃)。

那么有没有办法检查我是否应该在销毁时删除这个指针,或者该类是否应该首先接受它?

提前谢谢大家。

【问题讨论】:

  • 没有通用/便携的解决方案来检测这个。我不明白你为什么不使用标准智能指针......
  • 标准 C++11 智能指针没有直接数组等效项,您需要提供自定义删除器(不记得如何执行此操作,因为解决方案不太优雅)。由于该算法非常基本且远离 CPU 密集型,我现在坚持我的实现;)顺便感谢您提供的信息!
  • @DevilBlackDeath C++11 有 std::arraystd::vector,具体取决于您需要堆栈还是堆分配。
  • @MarkB 但是 std::vector 不允许我像智能数组一样管理分配的生命周期,这就是我使用两者的原因;)对于需要在退出当前范围时被释放我使用 std::vector 但为了更精细的生命周期我将使用智能数组(例如,当我管理我的 SFML 纹理时就是这种情况;))

标签: c++ pointers c++11


【解决方案1】:

没有。

您所希望的最好结果是基于某些特定库的实现细节的不可移植的黑客攻击,即使这样也会产生非零的误报结果。

【讨论】:

  • 太糟糕了 :( 至少当你熟悉指针时,这会在运行时产生一个相当容易理解的错误,因为我不打算让任何不熟悉 C++ 的人碰我的代码当前的实现应该可以解决问题:)
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2017-10-17
  • 2013-04-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多