0

我是 C++ 的初学者,对标头中声明的 const 指针的初始化感到困惑。仅举一个例子,我的标题中有一个结构和一个类,例如:

/* header file.h */
typedef struct A{ ... } A;

class myClass{
    protected:
        A *const myPtrA;
}

并且想实例化myPtrA的内容,比如在构造函数中,知道A是一个由子结构组成的相当复杂的结构,需要动态实例化:

/* source file.cpp */
#include file.h

myClass::myClass() {
   A *tmpA = new A;
   *myPtrA = *tmpA;
}

这是初始化我的 const 指针 myPtrA 的好方法吗?并且在每个新调用都需要一个专用的删除调用的范围内,我可以在 *myPtrA = *a; 行之后立即删除我的指针 tmpA 吗?没有丢失 myPtrA 指向的内容的风险?

提前感谢您的时间(请原谅我的英语;))

qroh

4

1 回答 1

2
*myPtrA = *tmpA;

这是初始化我的 const 指针 myPtrA 的好方法吗?

不,你根本没有初始化myPtrA。它是默认初始化的,因此具有不确定的值。取消引用具有不确定值 ( *myPtrA) 的指针具有未定义的行为。

我可以在 *myPtrA = *a; 行之后立即删除我的指针 tmpA 没有丢失 myPtrA 指向的内容的风险?

是的,它是安全的。指向的对象是 指向的对象的myPtrA副本(通过赋值)tmpA。但是,分配一个动态对象、复制它然后首先销毁它是完全没有意义的,因为您可以直接创建/修改副本。

以下是如何正确初始化成员指针的示例:

class myClass{
    protected:
        A *const myPtrA = new A;
};

PS。虽然学习如何执行此操作很有用,但您几乎不应该在实际程序中手动管理内存。而是使用 RAII 容器,例如std::unique_ptr.

于 2017-05-30T09:50:23.900 回答