我对此代码有一个疑问,即此代码不正确。它可以在运行时崩溃。由于 p 指针指向派生类成员变量(char数组)的地址 但是在派生类构造函数 base 类构造函数被调用之前,所以尚未完成内存初始化和派生类的分配。因此,当在基类构造函数中我们执行 strcpy 时,此代码可能会崩溃。
class Base
{
public:
char *p;
Base(){};
Base(char *a):p(a)
{
sprintf(a,"HELLO");
};
};
class Derived:public Base
{
public:
char arr[10];
Derived():Base(arr)
{
};
};
int main()
{
Derived d = new Derived();
return 0;
}
从这段代码我打算做的是将char数组的地址提供给基类,其中一些字符串需要在传递的地址上写入。 但我不确定这段代码是否会一直有效。 请澄清。
答案 0 :(得分:4)
这是明确定义的,但很脆弱 - 如果你改变arr
的类型,它可能会中断。
在运行任何构造函数之前为整个对象分配存储,并且由于arr
具有简单的初始化,因此一旦分配了存储,其生命周期就开始了。因此它可以在Base
构造函数中使用。
如果它是一个非平凡类型,如std::string
,则它在Base
构造函数中不可用,并且您有未定义的行为。