我总是想知道为什么在删除后将指针自动设置为NULL 不是标准的一部分.如果这一点得到解决,那么由于指针无效而导致的许多崩溃都不会发生.但是,我已经说过,我可以想到为什么标准会限制这个:
性能:
额外的指令可能会降低
delete性能.可能是因为
const指针.然后标准可能已经为这个特殊情况做了一些事情我想.
有没有人知道不允许这个的确切原因?
我有一个关于const指针的基本问题.我不允许使用const指针调用任何非const成员函数.但是,我可以在const指针上执行此操作:
delete p;
Run Code Online (Sandbox Code Playgroud)
这将调用类的析构函数,它实质上是一个非const'方法'.为什么允许这样做?它只是支持这个:
delete this;
Run Code Online (Sandbox Code Playgroud)
还是有其他原因吗?
这是代码审查评论之一.
在为任何对象调用delete之前检查NULL是个好主意吗?
我确实理解删除运算符在内部检查NULL并且是多余的,但是提出的参数是删除,因为运算符可以重载,如果重载版本没有检查NULL,它可能会崩溃.因此,假设如果和何时删除将被重载,它是否安全合理,它将检查是否为NULL?在我的理解中,合理地假设第一种情况是重载删除应该处理NULL检查,并且审查点不成立.你怎么看?
灵感来自这个问题.
假设在C++代码中我有一个有效的指针并且正确delete.根据C++标准,指针将变为无效(3.7.3.2/4 - 解除分配函数将使所有指针无效,指向解除分配的存储的所有部分).
至少在大多数实现中,它保留了值并将存储与以前完全相同的地址delete,但是使用该值是未定义的行为.
标准是否保证指针将保留其值或允许更改的值?
在之前的一个问题中,我认为一个好的答案被推荐用于建议使用宏
#define radian2degree(a) (a * 57.295779513082)
#define degree2radian(a) (a * 0.017453292519)
Run Code Online (Sandbox Code Playgroud)
而不是内联函数.请原谅新手问题,但在这种情况下,宏的错误是什么?
我在最近的一次采访中被问到这个问题,基本上是编写了一个函数来结合free的功能和赋值null.我用以下方式回答:
void main()
{
int *ptr;
ptr = new int;
ptr = newdelete(ptr);
}
(int*) newdelete (int *ptr)
{
delete(ptr);
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
因此在执行之后,当我从函数返回时,ptr本地main将保持空值newdelete.如果我刚刚NULL在newdelete函数中分配,则ptr本地newdelete将被取消,而不是ptr本地的main.
我认为我的解决方案是正确的,面试官也接受了.但是,他期待着其他一些答案.他坚持要求我不NULL从函数返回并仍然达到预期的效果.
有没有办法实现这一目标?我能想到的只是传递另一个参数,它是指向ptr本地指针的指针main,但我不明白为什么它比我做的更好!
当我们free()用C记忆时,为什么那个记忆没有填满零?在打电话时,有没有一种好方法可以确保这种情况发生free()?
我宁愿不冒险将内存中的敏感数据释放回操作系统......
在C++中,我们使用deleteoperator来在大多数时间删除对象.
该delete不会使指针值NULL.有什么方法可以自动实现吗?
例如
int *p = new int;
delete p; // this should deallocate object pointed by p
// and also initialized value of p = NULL
Run Code Online (Sandbox Code Playgroud) 关于指针,我有几个问题.第一:
ObjectType *p;
p->writeSomething();
Run Code Online (Sandbox Code Playgroud)
为什么在指针尚未初始化时可以在对象上调用方法?如果我运行该代码,我会在控制台窗口中获得"writeSomething()"的输出.第二:
ObjectType *p;
if(p==NULL)
cout<<"Null pointer";//This is printed out
p = new ObjectType;
delete p;
if(p==NULL)
cout<<"Null pointer";
else
cout<<"Pointer is not null";//This is printed out
Run Code Online (Sandbox Code Playgroud)
为什么第二个if语句中的指针不为null,如何检查指针是否指向任何内存地址?我还想知道是否有任何方法可以检查程序执行完毕后是否还没有释放某些内存.例如,如果您忘记在代码中写入1个删除语句.