读书人

这里动态分配的内存在哪释放是否造成

发布时间: 2012-09-07 10:38:15 作者: rapoo

请指教这里动态分配的内存在哪释放,是否造成内存泄露!
c++ primer的习题4.34.。
问题用红色字体表示
代码:
string word;
vector<string> vect;
while(cin >> word)
{
vect.push_back(word);
}

char **arr= new char*[vect.size()];
size_t ix = 0;

for(vector<string>::iterator iter = vect.begin();iter != vect.end();iter++,ix++)
{
char *p = new char[(*iter).size()+1];
strcpy(p,(*iter).c_str());
arr[ix] = p;
// delete [] p;这里不能释放p的内存。。我自己写的时候在这里把new出来的内存都释放了,运行的时候发生了错误,在下面输出的时候不是我输入的字符串。参考了答案,不能把p释放掉。这也能想通。p指向的内存写的是字符串,如果释放了,存的这些东西就保不住了。但是,我在想,这样的话p指向的内存不是造成内存泄露了吗?求教。。是不是会发生内存泄露。如果是,应该怎么办?
}

cout << endl << endl << "what input :" << endl;
for(size_t j = 0;j<vect.size();j++)
{
cout << arr[j] << endl;
delete [] arr[j];
}

delete [] arr;

[解决办法]
delete [] arr[j];

这里已经释放了
[解决办法]
不会的

delete [] arr[j];这里已经释放了
[解决办法]
arr[ix] = p; 之后,p所指向的动态内存就交给arr[ix]管理了,如果后面没有 delete [] arr[j];
操作,就会造成内存泄露。

[解决办法]
delete [] p;//动态分配的空间没了,下面打印肯定出错了
delete [] p == delete [] arr[j];
在打印之后delete,就没有问题了
delete [] arr[j]对应的是char *p = new char[(*iter).size()+1]
delete [] arr对应的是char **arr= new char*[vect.size()]

读书人网 >C++

热点推荐