Jon*_*han 117 c++ memory pointers initialization
有人可以解释为什么指针没有初始化NULL
?
例:
void test(){
char *buf;
if (!buf)
// whatever
}
Run Code Online (Sandbox Code Playgroud)
程序不会进入if,因为buf
它不是null.
我想知道为什么,在什么情况下我们需要一个带垃圾的变量,特别是指针解决内存上的垃圾问题?
Mar*_*ork 159
我们都意识到应该初始化指针(和其他POD类型).
那么问题就变成了"谁应该初始化它们".
那么基本上有两种方法:
我们假设编译器初始化了未由开发人员显式初始化的任何变量.然后我们遇到这样的情况:初始化变量是非常重要的,开发人员在声明点没有这样做的原因是他/她需要执行一些操作然后分配.
所以现在我们遇到这样的情况:编译器已经向代码添加了一条额外的指令,该指令将变量初始化为NULL,然后添加开发人员代码以进行正确的初始化.或者在其他条件下,变量可能永远不会被使用.许多C++开发人员会在这两个条件下以这个额外指令为代价尖叫犯规.
这不仅仅是时间问题.还有空间.在很多环境中,两种资源都非常宝贵,开发人员也不想放弃.
但是:您可以模拟强制初始化的效果.大多数编译器会警告您未初始化的变量.所以我总是将警告级别变为可能的最高级别.然后告诉编译器将所有警告视为错误.在这些条件下,大多数编译器将为未初始化但使用的变量生成错误,从而阻止生成代码.
Joh*_*ohn 40
引用TC++ PL中的Bjarne Stroustrup(特别版第22页):
功能的实现不应对不需要它的程序施加显着的开销.
小智 23
因为初始化需要时间.在C++中,你应该对任何变量做的第一件事是明确地初始化它:
int * p = & some_int;
Run Code Online (Sandbox Code Playgroud)
要么:
int * p = 0;
Run Code Online (Sandbox Code Playgroud)
要么:
class A {
public:
A() : p( 0 ) {} // initialise via constructor
private:
int * p;
};
Run Code Online (Sandbox Code Playgroud)
很少有几种情况可以使变量未初始化,而默认初始化的成本很低,为什么呢?
C++不是C89.天哪,连C都不是C89.您可以混合声明和代码,因此您应该推迟声明,直到您有一个合适的值来初始化.