在我的头文件中,我声明了一个类范围内的变量:
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;
答案 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语句。