区分是否为C++;对象是否已动态分配? < C++对象的内存可以在编译时分配(在堆栈上)。
或动态(通用方法)区分是否为C++;对象是否已动态分配? < C++对象的内存可以在编译时分配(在堆栈上)。,c++,memory-management,C++,Memory Management,或动态(通用方法) 有没有任何方法“强>内置到< /强> C++语言,允许人们区分一个对象是否以静态或动态方式分配?所谓内置,我指的是使用模板或关键字等(非编程/算法方法) 本质上,目标是“标记”未使用new操作符分配的对象(动态分配)。正如StoryTeller所说,您可能想要的是重载new操作符 class A{ private: bool isDynamic; public: void *operator new(size_t size){
有没有任何方法“强>内置到< /强> C++语言,允许人们区分一个对象是否以静态或动态方式分配?所谓内置,我指的是使用模板或关键字等(非编程/算法方法)
本质上,目标是“标记”未使用
new
操作符分配的对象(动态分配)。正如StoryTeller所说,您可能想要的是重载new
操作符
class A{
private:
bool isDynamic;
public:
void *operator new(size_t size){
isDynamic = true;
}
不,无法检测对象是静态还是动态分配的。至少在某种意义上,大多数人都会使用这些词:stack vs.heap。C++标准考虑了三种类型的存储,静态存储(全局变量、类的静态成员、静态局部变量)、动态分配和自动存储。 第三个问题使事情变得复杂,因为一个具有自动存储的对象可能会作为一个较大对象的一部分进行分配,而这个较大对象可能会在这三个领域中的任何一个领域进行分配。例如,在堆中分配的对象并由<代码> SydDypTr>代码>管理,它可能已经直接分配给<代码>新< /代码>,或者它可能是通过<代码> MaxySuffy创建的。在第一种情况下,会使用您的类型调用
new
,但在后一种情况下,会动态分配较大的块,并在适当的位置构造对象:
std::shared_ptr<T> p = std::make_shared<T>();
std::shared_ptr<T> q( new T() );
std::shared_ptr p=std::make_shared();
std::shared_ptr q(新的T());
现在有趣的一点是,为什么您关心对象是如何创建的,因为可能有不同的事情可以解决您真正的问题,而不涉及您所要求的。编译时不会分配任何内容,除非您计算一些
constepr
内容。重要注意:类没有分配;类(又称对象)的实例是。您是否在问如何识别堆上是否分配了某些内容?您可以通过重载operator new
@StoryTeller:不太可能,如果某个对象是较大对象的一部分,或者没有直接使用new分配,则可能会在堆中分配具有自动存储的对象(打一个电话给::operator new
,然后是placement new——听起来很尴尬?想想std::make_shared
)差不多。我认为OP想要捕获所有堆分配。这意味着必须覆盖全局运算符new
。此外,您的示例存在缺陷,因为运算符new
只返回原始内存的指针。可能吧,但我解释他的问题的方式是,他谈论的是一个特定的类。他可能需要澄清一点关于,我又添加了一行来澄清。重载new
操作符实际上是一种很好的方法,因为未使用new
分配的类的bool值将为false
@ParkerKemp如果我重载基类的new
操作符,如果基本上是new
操作符,该方法还能工作吗正在调用派生类的名称?基类如何知道该类是否使用new
分配?顺便说一句,这只是语义,但您应该了解“类”和“对象”之间的区别。我相信您理解这些概念,但在与其他人交流时区分这两个概念很重要。
class A{
private:
bool isDynamic;
public:
void *operator new(size_t size){
isDynamic = true;
}
std::shared_ptr<T> p = std::make_shared<T>();
std::shared_ptr<T> q( new T() );