在C ++中删除未初始化的对象

时间:2011-07-20 09:51:52

标签: c++ delete-operator

  

可能重复:
  Is it safe to delete a NULL pointer?

在我的头文件中,我声明了一个类范围内的变量:

    FaultModel<double>   *fm_req_set_odom_px;

...在类构造函数中有条件地初始化,具体取决于配置文件的值:

    const char *configModel = ConfigReader->ReadString("FaultModel");
    if (strcmp(configModel, "cyclic") == 0)
        fm_req_set_odom_px = new CyclicFaultModel<double>();

我的问题是:我是否需要使用条件包装删除以检查模型是否已初始化,或者在任何一种情况下只删除它是否安全?

   if (fm_req_set_odom_px != NULL) // Is this necessary?
       delete fm_req_set_odom_px;

7 个答案:

答案 0 :(得分:6)

除了适当指导您的其他答案外,

如果必须使用动态分配的对象,则不要使用原始指针,而是使用智能指针

始终使用 RAII(SBRM) ,这会让您的生活更轻松。 这样您就不必费心明确地删除任何资源,资源本身就会处理它

答案 1 :(得分:5)

delete NULL;保证是无操作,因此不需要手动检查。但是,单位化指针变量不是NULL,因此如果条件失败,您必须将其显式设置为NULL

if (strcmp(configModel, "cyclic") == 0)
    fm_req_set_odom_px = new CyclicFaultModel<double>();
else
    fm_req_set_odom_px = NULL;

或者,您可以在if语句之前无条件地将指针变量设置为NULL

fm_req_set_odom_px = NULL;
if (strcmp(configModel, "cyclic") == 0)
    fm_req_set_odom_px = new CyclicFaultModel<double>();

答案 2 :(得分:1)

无需支票。但更好的方法是使用智能指针...

答案 3 :(得分:0)

通常情况下,您可以使用类似boost::variant的内容来保留可能性。在这种情况下,基于堆的动态分配是浪费的。 boost::variant将始终为您妥善销毁它的内容,您不必担心编写自己的复制构造函数/赋值运算符。

答案 4 :(得分:0)

delete NULL;

无效,因此无需进行测试。

答案 5 :(得分:0)

delete检查NULL,不需要if (myVar != NULL) delete myVar;。另外,请考虑使用std::auto_ptr(或其他一些智能指针容器)。这可以让你摆脱很多麻烦,例如未初始化的指针。

答案 6 :(得分:0)

我认为首先要问的一个更基本的问题是:你是否在构造函数中将指针初始化为NULL? (例如,使用初始化列表)。

如果您没有将其初始化为NULL,那么当您尝试删除随机内存位时,您很可能会遇到访问冲突。 如果要将其初始化为NULL,则可以跳过if guard语句。