以前的标题:“我必须更换全球运营商的新增和删除来更改第三方代码中的内存分配策略吗? 小故事:我们需要更换第三方库中的内存分配技术,而不更改其源代码。 很长的故事: 考虑一下内存限制的应用程序,它可以实现巨大的dynamic分配(也许几乎所有可用的系统内存)。 我们使用专门的分配器,并在任何地方使用它们( shared_ptr ,容器等)。 我们对应用程序中分配的每个单字节内存都有完全的控制权。 另外,我们需要链接到第三方的帮助程序库 。 这个讨厌的人以某种标准的方式进行分配,使用默认的运算符new , new[] , delete delete[]或malloc或其他非标准的东西(让我们概括并说我们不知道这个库如何pipe理它的堆分配)。 如果这个帮助程序库进行足够大的分配,我们可以得到HDD抖动,内存碎片和alignment问题,内存不足bad_alloc以及各种问题。 我们不能(或不想)更改库源代码。 第一次尝试: 我们从来没有在发布版本中有过这样的邪恶“黑客”。 首先testing覆盖运营商的new作品罚款,除了: 我们不知道将来会有什么等待我们(这太糟糕了) 我们的用户(甚至是我们的分配者)现在必须以与我们相同的方式分配 问题: 有没有办法钩住这些分配而不会使全局运算符重载? (本地lib只钩子?) …如果我们不知道它到底用了什么: malloc或new ? 这个签名清单是否完整? (而且没有其他的东西我们必须执行): void* operator new (std::size_t size) throw (std::bad_alloc); void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); void* operator new (std::size_t size, void* ptr) throw(); […]
有没有一个电话,我可以让new来有零,如calloc内存?
为什么非放置的newexpression式和deleteexpression式实现为内置的语言而不是常规函数? 如果我们有… 一种向OS请求/回馈内存的方式 一种显式调用构造函数的方法(放置new ) 一种显式调用析构函数的方法( ~T() ) …为什么不能不放置new和delete只是在标准库中的常规function? 例: template <typename T, typename… Ts> T* library_new(Ts&&… xs) { auto* ptr = /* request enough memory for `T` from OS */; new (ptr) T(std::forward<Ts>(xs)…); return ptr; } template <typename T> void library_delete(T* ptr) { ptr->~T(); /* reclaim memory for `T` from OS */ }
我是一名获得计算机科学学位的大学生。 我的很多同学真的没有做很多的编程。 他们已经完成了课堂作业,但是说实话,这些问题并没有真正教会你如何编程。 我还有其他几个学生问我如何parsing问题,而我也不太清楚如何向他们解释。 最好是开始一行一行地寻找子串,或者只是给他们更复杂的关于使用适当的词法分析等来创build令牌,使用BNF和所有其他的东西的讲座? 当我试图解释它们的时候,他们从来都不太明白。 什么是最好的方法来解释这一点,而不会混淆它们或阻止他们实际尝试。
为什么C ++没有放置删除直接对应于新的位置,即调用析构函数并调用适当的位置删除操作符? 例如: MyType *p = new(arena) MyType; … //current technique p->~MyType(); operator delete(p, arena); //proposed technique delete(arena) p;