- 如何智能管理数组指针
如果在一个函数中需要new一块连续的空间,那么需要在所有可能返回的地方检查是否delete了这个空间
1.1 需要手动释放
void work()
{
bool bFlag = true;
char* pData = new char[1024];
bFlag = doWork1();
if( !bFlag ){
delete[] pData;
return;
}
bFlag = doWork2();
if( !bFlag ){
delete[] pData;
return;
}
delete[] pData;
return;
}
1.2智能指针自动释放
void work()
{
bool bFlag = true;
unique_ptr<char[]> pData(new char[1024]);
bFlag = doWork1();
if( !bFlag ){
return;
}
bFlag = doWork2();
if( !bFlag ){
return;
}
return;
}
- 连续开辟内存,不释放和使用智能指针管理的区别
2.1 一会内存就消耗殆尽
for(int j = 0; j < 1000000*1000;j++){
printf("%d\n",j);
char *p = new char[1024*1024];
sleep(0.1);
}
2.2 正常运行,没有问题
for(int j = 0; j < 1000000*1000;j++){
printf("%d\n",j);
unique_ptr<char[]> p(new char[1024*1024]);
sleep(0.1);
}
- 访问智能指针的地址,改变地址的内容
void printUnique(char* p,int n){
for(int i = 0; i < n;i++)
printf("%c ",p[i]);
printf("\n");
}
void main()
{
int n = 10;
unique_ptr<char[]> pData(new char[n]);
printUnique(pData.get(),n);
char* ptest = pData.get();
strcpy(ptest,"hello");
printUnique(pData.get(),n);
memset(pData.get(),0,n);
printUnique(pData.get(),n);
strcpy(pData.get(),"world");
printUnique(pData.get(),n);
}
参考博文
https://blog.youkuaiyun.com/ccb1372098/article/details/126190302
2.2.1 unique_ptr不支持普通的拷贝或赋值操作。但可以传递unique_ptr参数和返回unique_ptr
2.2.2 unique_ptr操作
https://www.cnblogs.com/xiangtingshen/p/10442242.html