Realloc 和 glocal new/delete 运算符覆盖
Realloc and glocal new/delete operator overriding
声明没有与 C realloc
函数等效的 C++,我在另一个问题中发现这种东西由 std::vector
自动管理,我们应该改用它。
我很好。我想,由于没有其他方法进行重新分配,std::vector
只会为我调用 realloc
。
但是,问题是:如果我重写 new
和 delete
运算符来管理全局跟踪内存使用情况,则在有人调用旧 C 的情况下将不会调用它们函数(malloc
、calloc
、realloc
、free
)。
怎么办? std::vector
替换 realloc
是否正确?
std::vector
不会调用 realloc
;它将使用它的分配器来实现类似的事情:分配新内存,将对象移入其中,然后释放旧内存。默认分配器使用 operator new
和 operator delete
,因此将使用您提供的替换项。
如果向量包含非平凡的对象,realloc
将是完全错误的事情;它复制原始数据,而 C++ 对象通常必须通过调用其特殊函数来复制或移动。
C++ 库中的任何内容(也许 operator new
和 operator delete
的默认实现除外)将直接调用 C 分配函数。由于您不应该自己调用它们,因此如果您使用的是 C 库,则只需要担心它们。
声明没有与 C realloc
函数等效的 C++,我在另一个问题中发现这种东西由 std::vector
自动管理,我们应该改用它。
我很好。我想,由于没有其他方法进行重新分配,std::vector
只会为我调用 realloc
。
但是,问题是:如果我重写 new
和 delete
运算符来管理全局跟踪内存使用情况,则在有人调用旧 C 的情况下将不会调用它们函数(malloc
、calloc
、realloc
、free
)。
怎么办? std::vector
替换 realloc
是否正确?
std::vector
不会调用 realloc
;它将使用它的分配器来实现类似的事情:分配新内存,将对象移入其中,然后释放旧内存。默认分配器使用 operator new
和 operator delete
,因此将使用您提供的替换项。
realloc
将是完全错误的事情;它复制原始数据,而 C++ 对象通常必须通过调用其特殊函数来复制或移动。
C++ 库中的任何内容(也许 operator new
和 operator delete
的默认实现除外)将直接调用 C 分配函数。由于您不应该自己调用它们,因此如果您使用的是 C 库,则只需要担心它们。