Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在对象构造期间获取最多派生类型_C++_Memory Management - Fatal编程技术网

C++ 在对象构造期间获取最多派生类型

C++ 在对象构造期间获取最多派生类型,c++,memory-management,C++,Memory Management,在我的项目中,我有一个抽象基类“base”。我希望跟踪从“Base”派生的对象的所有动态分配/解除分配。为此,我覆盖了“Base”中的new/delete操作符 在重写的new操作符中成功分配内存后,我想通知我用于跟踪内存的对象,分配已经发生,并且具有最派生的分配类型及其大小。大小不是问题(因为它直接传递给“Base”的新操作符),但是获取最多的派生类型是一个问题 我倾向于认为这是不可能的,因为我试图这样做。由于对象的更多派生部分尚未构建,因此无法知道它们是什么。然而,“基类”重载的新操作符知道

在我的项目中,我有一个抽象基类“base”。我希望跟踪从“Base”派生的对象的所有动态分配/解除分配。为此,我覆盖了“Base”中的new/delete操作符

在重写的new操作符中成功分配内存后,我想通知我用于跟踪内存的对象,分配已经发生,并且具有最派生的分配类型及其大小。大小不是问题(因为它直接传递给“Base”的新操作符),但是获取最多的派生类型是一个问题

我倾向于认为这是不可能的,因为我试图这样做。由于对象的更多派生部分尚未构建,因此无法知道它们是什么。然而,“基类”重载的新操作符知道一些关于最终产品的信息——大小——那么有可能知道关于它的其他信息吗

上下文:

void*Base::运算符新建(大小)
{
void*存储=malloc(大小);
if(存储==NULL)
抛出std::bad_alloc();
//通知MemoryTracker发生分配
//MemoryTracker::Instance().Allocate(类型、大小);
返回存储;
}

你说得对,这样做是不可能的,因为
new
操作符只是分配内存而已。正确的地方是构造函数,而不是分配器,在这里你应该能够使用RTTI来确定构建对象的类型(因此它可以在 Base< /C++ >构造函数中完成,而不是在每个子类构造函数中完成)。缺点是您必须使用宏而不是普通的新宏

struct base {
   void *operator new(size_t sz) {
     // ...
   }
};

struct init_tag {};

base * operator % (init_tag, base *ptr) {
  // just do what you like here...
  return ptr;
}

#define gc_new init_tag() % new

+1我不相信使用
运算符new
可以做到这一点,但我无法证明这一点。我很好奇,想看看我是否会被证明是错误的,关于C++语言的特性。RTTI不应该在基类构造函数中完全工作,因为它是基于vtable指针操作的,该指针被初始化为指向基类的vtable。这似乎是真的-在完全构造对象之前,是否有可能知道对象的最派生类型?@Wells:不,不是。基类构造函数在派生构造函数之前被调用。好的,非常感谢。看来这次我得回到画板上去了。