初始化一个指向结构c ++的const指针

时间:2017-05-30 09:07:42

标签: c++ pointers const initializing

我是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

1 个答案:

答案 0 :(得分:1)

*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