C++运算符new,对象版本和分配大小

miz*_*sho 2 c++ memory-management new-operator

我有一个关于对象的不同版本,它们的大小和分配的问题.该平台是Solaris 8(及更高版本).

假设我们有程序A,B和C都链接到共享库D.一些类在库D中定义,我们称之为'classD',并假设大小为100字节.现在,我们想为classD添加一些成员用于下一版本的程序A,而不会影响现有的二进制文件B或C.新的大小将是120字节.我们希望程序A使用classD的新定义(120字节),而程序B和C继续使用classD的旧定义(100字节).A,B和C都使用运算符"new"来创建D的实例.

问题是,运营商"new"何时知道要分配的内存量?编译时间或运行时间?我担心的一件事是,程序B和C期望classD为100字节,而新的共享库D需要120字节用于classD,如果我将它们与程序B和C链接,这种不一致可能会导致程序B和C中的内存损坏新的库D.换句话说,新的classD所需的额外20个字节的区域可以通过程序B和C分配给一些其他变量.这个假设是正确的吗?

谢谢你的帮助.

Pao*_*tti 6

更改类的大小是二进制不兼容的.这意味着如果更改大小classD而不重新编译使用它的代码,则会得到未定义的行为(很可能是崩溃).

解决这个限制的一个常见技巧是设计,classD以便可以以二进制兼容的方式安全地扩展,例如使用Pimpl习语.

在任何情况下,如果您希望不同的程序使用您的类的不同版本,我认为您别无选择,只能发布共享库的多个版本,并将这些程序链接到相应的版本.