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

Rez*_*zie 0 c++ delete-operator

可能重复:
删除NULL指针是否安全?

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

    FaultModel<double>   *fm_req_set_odom_px;
Run Code Online (Sandbox Code Playgroud)

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

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

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

   if (fm_req_set_odom_px != NULL) // Is this necessary?
       delete fm_req_set_odom_px;
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 6

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

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

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


fre*_*low 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;
Run Code Online (Sandbox Code Playgroud)

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

fm_req_set_odom_px = NULL;
if (strcmp(configModel, "cyclic") == 0)
    fm_req_set_odom_px = new CyclicFaultModel<double>();
Run Code Online (Sandbox Code Playgroud)

  • OP从未说过她将指针初始化为0,这是她的代码中更明显的缺陷. (4认同)
  • 恕我直言你应该使用C++ 0x nullptr,NULL宏不再流行:) - 编辑,Kerrek的注释是有效的,如果指针未初始化为nullptr,则删除它是不安全的. (2认同)