new一个很长的内存,局部、逐渐delete,可行吗?
比如从文件里读很长的字符串出来(这里为讲解方便,并非真的是字符串)。通常的做法是先读到一个char*内存上,然后解析这个字符串,解析这块是干什么,那块是干什么,再分配给各个string。这样,字符串从文件里读出来写到临时char*上一次,再分配给几个字符串一次。就复制了2次。如果文件特别大,就浪费了效率。
现在想,
char* temp = new char[10000];
char* str1,str2,str3;
解析
temp[10]='\0';
str1 = temp
temp[80]='\0';
str2 = temp+11;
temp[900]='\0';
str3 = temp+81;
然后str1 用完了,delete[10] str1;//C++里是不允许指定delete多少个的,这里是假设。
str3用完了,delete[n] str3;
str2用完了,delete[] str2;
[解决办法]
这种情况,建议把每个 temp 都存起来,在所有 str1用完之后,统一删除每个temp
[解决办法]
可以
int* array = new int[100];for(int i=0; i<100; i++) delete array++;
[解决办法]
//placement new 布局new操作符
char* buff = new char[10000];
然后一次把很多的文件内容读到这个buff中。
然后对这个buff的字符进行解析,比如找到第一个子串的起始位置是0,子串长度为10(不包括\0)
那么
char* str1 = new (buff) char[11];
如果第二个子串是紧跟着第一个子串,长度也是10
char* str2 = new (buff + 11) char[11];
....
释放的时候,不能对str1, str2 用delete
只能对buff用一次delete []
如果str1,str2是对象类型的,那么也不能用delete,而且要手动的执行对象的析构函数
最后delete [] buff