Tag: 删除操作符

如何控制第三方库代码中的内存分配策略?

以前的标题:“我必须更换全球运营商的新增和删除来更改第三方代码中的内存分配策略吗? 小故事:我们需要更换第三方库中的内存分配技术,而不更改其源代码。 很长的故事: 考虑一下内存限制的应用程序,它可以实现巨大的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`和`delete`而不仅仅是常规函数呢?

为什么非放置的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 */ }

时间复杂度删除运营商

什么是delete[]运算符的时间复杂性 ? 我的意思是它是如何实现的 – 是否遍历数组中的所有元素并调用每个元素的析构函数? 这个操作符是否对原始types ( int等)和用户定义的types做同样的事情?

为什么在C ++中没有放置删除expression式?

为什么C ++没有放置删除直接对应于新的位置,即调用析构函数并调用适当的位置删除操作符? 例如: MyType *p = new(arena) MyType; … //current technique p->~MyType(); operator delete(p, arena); //proposed technique delete(arena) p;