前段时间我看到一篇关于全局覆盖new和delete运算符的问题的帖子。 Post说它可能会导致STL和许多其他库出现问题。
现在我正在写一个内存管理器。我正在考虑覆盖全局 new和删除运算符以优化整个应用程序。在自定义内存管理器中,使用了相同的旧的new和delete运算符(在运行时根据需要分配大块内存,同时分配部分内存以供我的软件实际使用)。
我正在使用VS2010
- 编辑 -
我应该在MemoryManager仪式中使用malloc()和free()。
答案 0 :(得分:0)
如果您要覆盖全局新/删除,最好使用经过良好测试和执行的库:
原因是这些库在一般情况下会比你能编写的任何东西都好(更少的错误,更多的性能等)。 如果您需要针对特定情况(堆栈分配,池)进行特定分配,则必须使用用户可以更改的自定义分配器使您的代码可扩展(如果用户可以访问并重新编译源代码,则很容易,否则您必须提供某种类型的代码)接口)。
请注意,STL容器使用自定义分配器,因此您只需更改分配器即可改善/降低其性能:
C ++ 11方式:
namespace myspace{
template< typename T>
using myVector = std::vector<T, yourAllocator<T>>;
}
//usage
myspace::myVector vec;
旧方式:
namespace myspace{
template<typename T>
struct myVector{
typedef std::vector<T, yourAllocator<T>> type;
};
}
//usage
myspace::myVector::type vec;
如果你真的希望覆盖全局新/删除所有你需要的是编译你自己的新版本/删除(当然你必须使用一些 malloc / malloc库)并将其链接到你的可执行文件是最后一个(我认为顺序无关紧要,除非有人也覆盖这些运算符)。
<强>问题:强>
在Windows上,您无法覆盖DLL的全局新/删除,因为您无法控制链接。 返回并再次阅读。如果您无法重新编译/重新链接DLL,则无法覆盖其内存分配,这意味着您在使用DLL时必须小心。通常这不是问题,除非您尝试使用自己的删除删除DLL创建的内容。对于没有问题的系统DLLS(您只能使用系统函数创建对象/句柄,并且只能使用系统函数来销毁对象/句柄)
我只是问你一个问题,我会让你找到答案: 如果你有一个类,那么这个类被编译成一个DLL(在Windows上)你是否真的需要担心,如果你用自定义的new / delete创建一个子类,然后你创建该类的自定义实例?
class DLLEXPORT AClass{
//stuff
//...
};
你的代码
class MyClass: public AClass{
};
或
class MyClass: public virtual AClass{
};
//inside your program
AClass * a = new AClass;
MyClass * m = new MyClass;