C++ 我们能否确定所指向的数据是否是手动分配的?

C++ 我们能否确定所指向的数据是否是手动分配的?,c++,pointers,c++11,C++,Pointers,C++11,问题就在于此。在C++中,如果指针不是 null ,有没有方法可以确定指向的数据是否被分配在堆上(新类型分配)或堆栈(典型的分配和当前作用域生存期)。 我有一个智能指针和数组的实现(我知道智能指针存在于C++11中,但我避免使用它们,直到有一种比目前更干净的方法来添加智能数组),我在其中跟踪引用计数等等。只要指针不再被引用,它就是delete。问题是,当前的实现并没有阻止给类一个指向堆栈上变量的指针(我不想通过智能指针强制创建指针,我有一个具体的情况,我想自己进行分配,例如在函数中创建数组时,在

问题就在于此。在C++中,如果指针不是<代码> null <代码>,有没有方法可以确定指向的数据是否被分配在堆上(<代码>新<代码>类型分配)或堆栈(典型的分配和当前作用域生存期)。 我有一个智能指针和数组的实现(我知道智能指针存在于C++11中,但我避免使用它们,直到有一种比目前更干净的方法来添加智能数组),我在其中跟踪引用计数等等。只要指针不再被引用,它就是delete。问题是,当前的实现并没有阻止给类一个指向堆栈上变量的指针(我不想通过智能指针强制创建指针,我有一个具体的情况,我想自己进行分配,例如在函数中创建数组时,在同一函数中,它需要在交给调用方之前调整大小,等等),但如果我给出这样一个指针,该类将尝试在该指针上调用
delete
delete[]
,这将导致未定义的行为(老实说,大多数情况下都会崩溃)

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

提前谢谢大家。


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

没有通用/可移植的解决方案来检测这一点。我不明白您为什么不使用标准智能指针……标准C++11智能指针没有直接数组e等价的,你需要提供一个定制的删除器(不记得怎么做,因为解决方案不是很优雅)。由于算法非常基本,而且远离CPU密集型,我现在坚持我的实现;)顺便说一句,谢谢你的信息@DevilBlackDeath C++11具有
std::array
std::vector
,这取决于您是否需要堆栈或堆分配。@MarkB但std::vector不允许我像智能数组那样管理分配的生存期,这就是为什么我同时使用这两种方法;)对于退出当前作用域时需要释放的堆分配,我使用std::vector,但对于更细粒度的生命周期,我将使用智能阵列(例如,当我管理我的SFML纹理时就是这种情况),这太糟糕了:(至少当你熟悉指针时,这会在运行时产生一个相当容易理解的错误,因为我不想让任何不熟悉C++的人碰我的代码,我的当前实现应该做这个窍门: