我经常NULL在删除指针之前看到遗留代码检查,类似于
if (NULL != pSomeObject)
{
delete pSomeObject;
pSomeObject = NULL;
}
Run Code Online (Sandbox Code Playgroud)
NULL在删除之前有没有理由检查指针?NULL之后设置指针的原因是什么?
我正在使用像C++这样的C++阅读它
#define max(a,b) (a > b ? a : b)
Run Code Online (Sandbox Code Playgroud)
可以导致"双重评估".有人能给我一个例子,说明何时进行双重评估以及为什么它会变坏?
PS:令人惊讶的是,除了在Clojure中的一个例子(我无法理解)之外,我在google搜索时找不到任何详细的解释.
如果是这样,为什么下面的代码会给我警告
注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete
?
struct C;
int main()
{
C *c = nullptr;
delete c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白为什么它会在一般情况下是不确定的行为,如果C有非平凡/虚析构函数,但不标准的保证/定义delete上nullptr始终是一个noop不管情况如何?
重申:我具体询问指向不完整类型的指针的情况nullptr!
致力于在C++中实现我自己的BST,以获得处理此类结构的经验.
我在实现析构函数时遇到了麻烦.我在学习中发现,一个人不能真正有一个递归的析构函数(由于一个标志不允许在被调用后在同一个对象上调用析构函数),但我不确定是否另一种成功清理树中所有节点的方法.
为了补偿,我创建了一个辅助函数 - 但是这会在'delete n'行上抛出一个未解决的外部错误.有小费吗?
码:
void BinSearchTree::Clear(tNode* n)
{
if (n->left != NULL)
Clear(n->left);
if (n->right != NULL)
Clear(n->right);
delete n;
n = NULL;
size--;
}
Run Code Online (Sandbox Code Playgroud) 我刚刚在C++上重读了一些代码(我现在正在学校学习Java),而且当我必须使用删除时,我有点困惑.
例如:声明两个对象时:
Fraction* f1;
Fraction* f2;
Run Code Online (Sandbox Code Playgroud)
并像这样创建f1和f2:
f1 = new Fraction(user_input1, user_input2);
f2 = new Fraction(user_input3, user_input4);
Run Code Online (Sandbox Code Playgroud)
下次我想使用newoperator创建一个新对象时,是否必须先删除?我很困惑,因为我习惯在java中使用垃圾收集器来处理对象及其删除.在重新使用新内容之前是否必须删除?
if (f1) delete f1;
if (f2) delete f2;
//initialize again...
Run Code Online (Sandbox Code Playgroud) 我记得在某个地方读过delete NULL要在C++中成为有效的操作是必要的,但是我不能记得为什么它应该如此.有人请提醒我吗?
所以我偶然发现了这段代码,虽然我已经用C/C++编写了大约5年的代码,但我无法理解为什么有人想要这样做.我理解你为什么要NULL在释放内存之后设置指针,但我当然不明白为什么有人会想要反过来(看起来像是内存泄漏给我).
其次,我很确定没有必要在将指针NULL设置为NULL并将其删除之前检查指针是否正确,如此处所述.
if( m_pio )
{
m_pio = NULL;
delete m_pio;
}
Run Code Online (Sandbox Code Playgroud) 我试图理解C++中的内存部分.我在使用下面的代码生成输出后尝试释放内存.
是否有必要使用if语句释放内存?
int main(){
char *pc;
int *pi;
pc = new char('a');
pi = new int(8);
cout << *pc << endl;
cout << *pi << endl;
//What's the purpose for doing if(pc) and if (pi) below?
if(pc){
delete pc;
}
if(pi){
delete pi;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?int main(){char*pc; int*pi;
pc = new char('a');
pi = new int(8);
cout << *pc << endl;
cout << *pi << endl;
delete pc;
delete pi;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我的问题:
int* x = new int;
cout << x<<"\n";
int* p;
cout << p <<"\n";
p = x;
delete p;
cout << p <<"\n";
Run Code Online (Sandbox Code Playgroud)
我自己写这篇文章是为了理解指针并理解(也迷失)动态new和delete.
我的XCode可以编译程序并返回以下结果:
0x100104250
0x0
0x100104250
Run Code Online (Sandbox Code Playgroud)
我知道我只能在动态分配的内存上调用delete.但是,我p在上面的程序中调用了delete 并编译.
谁有人向我解释这个?我为什么要删除p?
此外,我发现程序是否更改为以下内容:
int* x = new int;
int* p;
cout << p <<"\n";
delete p;
cout << p <<"\n";
Run Code Online (Sandbox Code Playgroud)
然后我的Xcode再次编译并返回给我:
0x0
0x0
Program ended with exit code: 0
Run Code Online (Sandbox Code Playgroud)
现在,我完全迷失了:(.有人可以解释一下吗?为什么我可以删除,p因为它没有任何关系x?
由于Xcode编译成功,我认为上述两个程序对于计算机是正确的.但是,我认为这又是"只对动态分配的内存进行调用删除"的陈述.或者可能,我没有完全理解什么是指针以及什么是动态分配的内存.我在网上搜索时找到了这篇文章.但我不认为这就像我的情况.
请帮帮我.
我想再问一个问题.代码在这里是关于二叉搜索树.从第28行到第32行,它涉及删除一个孩子的节点.我把这部分代码放在这里,万一网页链接不起作用.
else …
可能重复:
删除前在C++中测试void指针
代码段1是否等效于代码段2?
//Snippet 1:
delete record;
record = new Record;
//Snippet 2
if (record != NULL)
{
delete record;
record = NULL;
}
record = new Record;
Run Code Online (Sandbox Code Playgroud)