C++ Builder/Delphi中未初始化的内存

Jos*_*ley 2 delphi initialization c++builder

Delphi中的未初始化变量是否保证具有任何特定值

  • 在堆栈上?
  • 在堆上?

由于C++ Builder一般遵循Delphi的设计,因此C++ Builder中未初始化的变量保证具有任何特定的价值

  • 在堆栈上?
  • 在堆上,对于从TObject派生的类的成员变量?
  • 在堆上,对于POCO的成员变量?

我继承了一些C++ Builder代码,这些代码很大程度上取决于成员变量的零初始化,并试图弄清楚语言是否能保证这一点.

当Windows首次被提供给程序的堆栈或堆时,Windows是否保证内存是零初始化的?(编辑:我意识到程序会在执行时覆盖内存,所以它不能继续依赖于此;我只是想弄清楚我观察到的行为.)

Ben*_*ehn 8

由于caskey的回答仅涉及c ++我对delphi的回答:

在Delphi参考此答案贾科莫德利阿布鲁Esposti

  • 对象字段始终初始化为0,0.0,'',False,nil或任何适用的值.
  • 全局变量始终初始化.(到0)
  • 局部变量是单元化的,因此您必须先分配一个值才能使用它们.

MS-帮助://borland.bds4/bds4ref/html/Variables.htm

所有学分归Giacomo Degli Esposti所有

编辑:"当Windows首次提供给程序的堆栈或堆时,Windows是否保证内存零初始化? "

Windows保证在首次将内存添加到新进程时对内存进行零初始化(否则,无论权限如何,程序都能够读取其他进程丢弃的内存,因此存在很大的安全问题).但是使用c ++这个保证对你没有多大帮助,因为在你的代码有机会使用它之前,c-runtime可以自行覆盖内存.

Edit2:对于c ++构建器变量显然是为" VCL样式类 " 初始化的(无论这意味着什么,都是从TObject继承的?),请参阅http://docs.embarcadero.com/products/rad_studio/cbuilder6/EN/CB6_DevelopersGuide_EN. PDF格式

我引用:

"因为数据成员可能在虚函数中使用,所以了解它们何时以及如何初始化是很重要的.在Object Pascal中,所有未初始化的数据都是零初始化的.例如,这适用于其构造函数未调用的基类. .继承了在标准C++,不存在未初始化的数据成员的值的保证.以下类型的类的数据成员必须在类的构造函数初始化列表进行初始化:•参考•数据成员没有默认构造函数

但是,在调用基类构造函数时,这些数据成员的值或构造函数体中初始化的值是未定义的.在C++ Builder中,VCL样式类的内存是零初始化的.

从技术上讲,VCL或CLX类的内存为零,即位为零,值实际上是未定义的.例如,引用为零.

依赖于在构造函数体中或初始化列表中初始化的成员变量的值的虚函数可能表现为好像变量初始化为零.这是因为在处理初始化列表或输入构造函数体之前调用基类构造函数.

#include <sysutils.hpp>
class Base : public TObject {
public:
    __fastcall Base() { init(); }
        virtual void __fastcall init() { }
    };
class Derived : public Base {
    public:
        Derived(int nz) : not_zero(nz) { }
        virtual void __fastcall init()
        {
        if (not_zero == 0)
        throw Exception("not_zero is zero!");
        }
    private:
        int not_zero;
};
int main(void)
{
    Derived *d42 = new Derived(42);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此示例在Base的构造函数中引发异常.因为Base是在Derived之前构造的,因此not_zero尚未使用传递给构造函数的值42进行初始化.请注意,在调用基类构造函数之前,不能初始化VCL样式类的数据成员."