【问题标题】:Problems related to overriding global new and delete operators与覆盖全局 new 和 delete 运算符相关的问题
【发布时间】:2015-02-21 09:08:01
【问题描述】:

前段时间,我看到一篇关于全局覆盖 new 和 delete 运算符的问题的帖子。 Post 说它可能会导致 STL 和许多其他库出现问题。

现在我正在编写一个内存管理器。我正在考虑覆盖 global new 和 delete 运算符以优化整个应用程序。在自定义内存管理器中,使用了相同的旧的 new 和 delete 运算符(在运行时根据需要分配大块内存,同时分配其中的一部分以供在我的软件中实际使用)。

  • 这种方法有什么问题吗?我希望在我的应用程序中使用许多库,例如 DirectX、STL 和 Boost。
  • 我在第一段提到的那些谣言是真的吗?

我正在使用 VS2010

-- 编辑--

我应该在 MemoryManager 仪式中使用 malloc() 和 free()。

【问题讨论】:

标签: c++ visual-c++ memory-management stl new-operator


【解决方案1】:

如果您要覆盖全局新建/删除,最好使用经过良好测试且性能良好的库:

原因是这些库在一般情况下会比您可以编写的任何东西更好(更少的错误,更高的性能等)。 如果您需要针对非常特定的情况(堆栈分配、池)进行特定分配,则必须使用用户可以更改的自定义分配器使您的代码可扩展(如果用户可以访问并重新编译您的源代码,则很容易,否则您必须提供某种界面)。

请注意,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;

如果您真的希望覆盖全局 new/delete,您只需编译您自己的 new/delete 版本(当然您必须使用一些 ma​​lloc/malloc 库)并将其链接到您的可执行文件最后(我认为顺序无关紧要,除非其他人也覆盖这些运算符)。

问题:

在 Windows 上,您无法覆盖 DLL 的全局新建/删除,因为您无法控制链接。 返回并再次阅读。如果您无法重新编译/重新链接 DLL,则无法覆盖其内存分配,这意味着您在使用 DLL 时必须小心。通常这不是问题,除非您尝试使用自己的 delete 删除由 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2021-06-20
    • 1970-01-01
    • 2012-01-13
    • 2013-07-07
    相关资源
    最近更新 更多