我试图两次解除分配相同的指针,但失败了,但如果我按照相同的步骤而不使其为NULL,则代码运行正常.
#include <iostream>
struct MyClass {
MyClass() {std::cout << "Allocated and Constructed" << std::endl ;}
};
int main () {
// allocates and constructs five objects:
MyClass * p1 = new MyClass[5];
delete[] p1;
delete[] p1; // The code will succeed if I comment this line of code
p1=NULL;
delete[] p1;
delete[] p1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我看到一个很好的答案问题当你在C++中解除分配指针两次或更多时会发生什么?但是如果我把它设为NULL会使它运行的原因应该是两种情况下应该遵循的行为相同吗?
假设指针对象正在一个点上分配,并且它正被返回到不同的嵌套函数.有一次,我想在检查它是否有效或已经由某人解除分配后取消分配该指针.
是否有任何保证可以使用?
if(ptr != NULL)
delete ptr;
Run Code Online (Sandbox Code Playgroud)
要么
if(ptr)
delete ptr;
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.它总是给出分段错误
#include <iostream>
class A
{
public:
int x;
A(int a){ x=a;}
~A()
{
if(this || this != NULL)
delete this;
}
};
int main()
{
A *a = new A(3);
delete a;
a=NULL;
}
Run Code Online (Sandbox Code Playgroud)
编辑
每当我们谈论指针时,人们就会开始询问,为什么不使用Smart Pointers.仅仅因为智能指针存在,每个人都无法使用它.
我们可能正在使用旧式指针的系统.一天,我们无法将所有这些转换为智能指针.
假设我有以下课程:
foo{
~foo();
private:
char *bar;
};
Run Code Online (Sandbox Code Playgroud)
在某些条件下,bar会创建一个新的char数组,那么处理删除它的正确方法是什么?一个简单的布尔会做或者会被认为是不好的做法吗?
我有一个方法返回一个新的映射指针,后来消耗.在使用地图的地方,我有以下代码:
void Updater::set_data(map<string, string> * data)
{
if (this->data != NULL)
{
delete this->data;
}
this->data = data;
}
Run Code Online (Sandbox Code Playgroud)
只要应用程序正在运行,此使用者就会运行.
但是,我的应用程序正在泄漏内存并且Valgrind报告它正在泄漏(1个块中的600个(48个直接,552个间接)字节在丢失记录中明确丢失...)在构造映射的行中:
map<string, string> * values = new map<string, string>();
Run Code Online (Sandbox Code Playgroud)
我做错了什么来摆脱地图(并释放内存)?我没有太多的C++经验,所以我猜这是一些初学者的错误,但我花了大量的时间试图计算它可能是什么.
编辑 我只有2个更新程序运行(或者如果我选择了1,但总是预定义的固定数量),并且地图始终包含类似的数据,通常甚至与以前完全相同.
在调用delete或delete []之前总是省略NULL指针检查是否安全,特别是在编写跨平台代码段时?
我记得几年前(三四个)我编写的相同代码正在使用MS Windows(使用MSVCv12工具链编译)但是使用g ++编译的Linux版本(遗憾的是,我不记得g ++版本)抛出了NULL指针引用.我发现当时可能是编译器错误的信息.
我已经找到了这个SO线程,但在阅读之后我仍然不太确定它是否安全,如果是这样 - 从哪个版本的C++标准?
可能重复:
删除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) 假设我有以下功能:
void destroy(Song* song) {
if (song)
delete song;
}
Run Code Online (Sandbox Code Playgroud)
是否可以将实现更改为以下内容,以删除空验证?
void destroy(Song*& song) {
delete song;
}
Run Code Online (Sandbox Code Playgroud)
如果是,为什么?
我很好奇,想知道即使在程序结束后,指针是否仍会指向某个地址。
有人告诉我,在释放内存后,我们应该始终将指针设置为 null,如下所示:
int* num = new int(2);
// do something with num
delete num;
num = nullptr;
Run Code Online (Sandbox Code Playgroud)
但是,如果我的指针没有指向动态内存中的地址,而是指向堆栈中的公共地址,例如:
int num = 2;
int* pnum = #
// do something with pnum
Run Code Online (Sandbox Code Playgroud)
那么我是否也应该将指针设置为空?因为我不想让它继续指向一个地址
pnum = nullptr;
Run Code Online (Sandbox Code Playgroud)
如果我不将其设置为 null,一旦我的程序运行完毕,它仍然会指向该地址吗?
我被教导在动态内存用例中始终将指针设置为空,但是指向公共堆栈内存地址的指针又如何呢?
伊迪丝感谢评论中所有情绪激动的人,是的,我是一个 20 岁的菜鸟,还在学习,是的,你太聪明了,没有人能对付你的智商,因为你太聪明了哈哈哈。不要再嘲笑我或其他试图提供帮助的人。对于所有给出简单逻辑解释的人,我很感激。
考虑以下代码:
int main() {
int *i = nullptr;
delete i;
}
Run Code Online (Sandbox Code Playgroud)
问题:
c++ ×9
pointers ×3
c++11 ×1
c++14 ×1
dereference ×1
memory-leaks ×1
null ×1
null-pointer ×1
reference ×1