有啥方法可以防止类的动态分配?

Posted

技术标签:

【中文标题】有啥方法可以防止类的动态分配?【英文标题】:Any way to prevent dynamic allocation of a class?有什么方法可以防止类的动态分配? 【发布时间】:2011-09-10 10:14:04 【问题描述】:

我在我的嵌入式系统中使用 C++ 基类和子类(为了清楚起见,我们称它们为 A 和 B)。

这是时间和空间的关键,所以我真的需要它是最小的。

编译器抱怨缺少虚拟析构函数,我理解这一点,因为如果您分配 B* 并随后将指针作为 A* 的实例删除,这可能会给您带来麻烦。

但我永远不会分配此类的任何实例。有没有一种方法可以重载operator new(),以便在没有动态分配任一类时编译,但如果最终用户尝试分配 A 或 B 的新实例,则会导致编译器错误?

我正在寻找一种与通过私有构造函数“毒化”自动编译器复制构造函数的常用技术类似的方法。 (例如http://channel9.msdn.com/Forums/TechOff/252214-Private-copy-constructor-and-private-operator-C)

【问题讨论】:

你帖子的最后一部分让我想知道你是否需要单例模式实现。en.wikipedia.org/wiki/Singleton_pattern @Rycul:谢谢,它们不是单例,只是在小型嵌入式系统中,我们倾向于使用静态或堆栈分配来完成几乎所有事情。 只是为了好奇。我不明白,你为什么需要一个虚拟析构函数?仅仅因为你正在派生并不意味着你需要一个虚拟析构函数。你还有其他虚拟功能吗?如果你一开始不打算使用动态内存,你将如何使用这样的功能? @alfC:重读:“编译器抱怨缺少虚拟析构函数。” 附注对 cme​​t 多年前提出的问题的回答保持低期望 【参考方案1】:

您可以像使用复制构造函数一样毒化operator new。只要确保不要毒放置新的。虚拟析构函数仍然是一个不错的建议。

int main() 
    char data[sizeof(Derived)];
    if (condition)
        new (data) Derived();
    else
        new (data) Base();
    Base* ptr = reinterpret_cast<Base*>(&data[0]);
    ptr->~Base();

【讨论】:

“虚拟析构函数仍然是一个很好的建议。” -- 会的,除了没有动态内存分配它不会被使用,而且这一类的内存成本太高了。 (否则我只会在那儿贴一个空的虚拟析构函数并完成它。) @Jason S:我不太确定。动态分配并不总是意味着堆 - 它也可能意味着放置新。我可以轻松地创建一个不使用任何动态内存分配并且仍然依赖于虚拟析构函数的示例。如果您绝对不能使用,那么也可以使用新的毒药放置。 你知道任何“简单”的使用placement new w/o dynamic memory allocation的案例吗?这是一个内存相对有限的处理器 + 没有标准库(所以这里没有 STL;我们没有使用堆栈或队列或其他东西)。 @Jason:刚刚发布了一个。我想如果你确定你正在编写程序中的每一行,你可以避免它,或者只是毒化放置 new,但是如果没有虚拟析构函数,该代码是未定义的。 好吧,我想我也可以将析构函数设为私有。【参考方案2】:
class A

private:
    void *operator new(size_t);
    ...
;

省略号用于operator new 的其他覆盖和类的其余部分。

【讨论】:

void* operator new(size_t) = delete;【参考方案3】:

只需将 operator new 设为私有

【讨论】:

以上是关于有啥方法可以防止类的动态分配?的主要内容,如果未能解决你的问题,请参考以下文章

C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?

引用传递和动态内存分配之间有啥区别[关闭]

c和c ++中的动态内存分配和堆有啥区别

我的 Fortran 动态分配代码有啥问题?

当您动态分配内存时,“指针类型”有啥意义?

使用 template<int size> 比动态分配有啥好处?