是否能够直接操作内存资源,不同的程序语言有不同的选择(语法机制),有的程序语言(如C#和Java)有垃圾回收机制,而C因为效率和便利的考虑,能够通过指针操作内存资源,且无垃圾回收机制。C++延续C的效率原则,但在指针的安全使用方面做了努力,引入了引用、异常处理机制,通过newdelete封装了malloc()free(),且在STL封装了智能指针。
标记(mark)和清扫(sweep)是一种垃圾回收方法。使用这种方法的垃圾回收器定期检查程序中的每个指针数组指针,并将指针引用的内存标记为仍在使用。在每一轮周期结束时,未标记的内存视为没有在使用,因而被释放。

a 在垃圾回收器中注册所有指针,这样就可以进行遍历操作;

b 让所有对象都从一个混入类中派生,允许垃圾回收器将对象标记为正在使用;

c 确保垃圾回收器运行时不能修改指针;

垃圾回收可能也会引发一些问题数组指针,如当垃圾回器运行时,程序可能会停止响应。析构函数具有不确定性。
对于“裸指针”,从声明、定义、分配、初始化、访问、释放、置NULL的整个过程都有可能发生错误:
// 1 访问错误
// 1.1 内存分配未成功,却使用了它
void allocatedMayFailure()
{
int* arr = new int[1000000000]; // may return nullptr
if(arr==NULL) return;
arr[0] = 1;
cout<<arr[0];
delete[] arr;
}
// 1.2 访问非法指针
void accessInvalid()
{
int* p = reinterpret_cast(1000);
*p = 5; // bug, p is not a valid pointer, crash!
}
// 1.3 内存分配虽然成功,但是尚未初始化就引用它
void readUninitialized()
{
int* p;
cout<<*p; // bug, p is uninitialized
}
// 1.4 内存分配成功并且已经初始化,但操作越过了内存的边界
void accessElsewhere()
{
int x, y[11], z;
x=0;
z=0;
for(int i=0; igo();
delete p;//如果go()抛出异常,delete得不到执行从而产生内存泄露
}
void notleaky()
{
unique_ptr p(new Simple()); //c+11
p->go();
}
// 2.5 使用 free 或 delete 释放了内存后,没有将指针设置为 NULL。
// 导致产生" 野指针"(指向的内存是已被操作系统回收的指针)。
void noNull()
{
char* p = new char[10];
memset(p,0,10);
delete [] p;
//p=NULL; // 指针释放后记得赋NULL值
if(p!=NULL)
{
strcpy(p,"hello!"); // 使用悬空指针(野指针)
cout<<p;
}
}
//2.6 释放堆上指针
void freeStack()
{
int x;
int* p = &x;
delete p; // bug, freeing stack memory, crash!
}
-End-
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: Esaan521
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。




