Visual Studio和Xcode
区别在于:两种IDE对未初始化的内存是否赋初值,对释放的内存是否清空。
Visual Studio环境下
VC++为了方便调试,在Debug模式下,会把未初始化的栈内存全部填成0xCC。会把未初始化的堆内存全部填成0xCD。但是Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么。
未初始化的栈变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是“烫”字。同理,0xCDCD就是“屯”字。参考的文章
Xcode环境下
虽然Xcode里也有分Debug和Release模式。
在Product->Scheme->Edit Scheme->Run->Build Configuration里。
但是在Debug模式下不会去给未初始化的变量赋初值。也不会把delete掉的内存清零。
//这段代码说明Xcode环境Debug模式下,delete掉一块内存不会去把那块内存清零。
#include <iostream>
int main(int argc, const char * argv[]) {
int * p = new int(4);
std::cout << *p << std::endl;
delete p;
//正常情况下是一定要写p=nullptr的,但是万一忘了写这句话的话就会出现下面的问题
//p = nullptr;
std::cout << "p已经被delete掉了,还可以使用p。*p=" << *p << std::endl;
return 0;
}
//这段代码说明p指向的那块内存被释放后没有清零,又分配给了q
#include <iostream>
int main(int argc, const char * argv[]) {
int * p = new int(4);
delete p;
//正常情况下是一定要写p=nullptr的,但是万一忘了写这句话的话就会出现下面的问题
//p = nullptr;
int * q = new int;
std::cout << *q << std::endl;//这里会打印出4
return 0;
}
网友评论