如何删除已为阵列models
,names
分配的内存?我尝试了所有方法,但是当我运行它时它总是崩溃。
int main()
{
vector<Person*> people;
const int PERSON_SZ = 4;
char * names[] = {"Jim", "Fred", "Harry", "Linda"};
int ages[] = { 23, 35, 52, 59 };
for (int i = 0; i < PERSON_SZ; i++)
{
Person * temp = new Person(names[i], ages[i]);
people.push_back(temp);
}
// A vector of Car pointers
vector<Car*> cars;
const int CAR_SZ = 3;
char * models[] = { "Festiva", "Ferrarri", "Prius" };
srand(time(0));
for (int i = 0; i < CAR_SZ; i++)
{
Car * temp = new Car(models[i]);
temp->set_driver(people[rand() % (people.size())]);
temp->set_owner(people[rand() % (people.size())]);
cars.push_back(temp);
}
for (int p = 0; p < people.size(); p++)
{
people[p]->increment_age();
}
for (int c = 0; c < cars.size(); c++)
{
cars[c]->print();
}
delete [] names;
for ( int r = 0; r < CAR_SZ; ++r )
{
delete [] models[r];
}
return 0;
}
答案 0 :(得分:3)
您没有使用models
分配names
和new
,因此您无法delete
他们。
当函数返回时,两个数组都在堆栈上分配并自动删除。
(字符串)数组的内容(即字符串本身)存储在全局数据段中,根本无法释放。这也是危险的,因为编译器可能在程序的不同位置使用相同的字符串常量。
答案 1 :(得分:2)
models数组和names数组都是静态分配的。您没有使用new
创建它们,您不需要删除它们。但是,您应该按如下方式更改其类型:
const char * names[] = {"Jim", "Fred", "Harry", "Linda"};
const char * models[] = { "Festiva", "Ferrarri", "Prius" };
因为它们是指向字符串文字的指针,它们是只读的。
答案 2 :(得分:2)
变量names
和models
不是动态分配的,这些数组中的数据也不是。所以不需要释放它们或它们的内容。
另外,两个vector
包含需要免费的数据。
答案 3 :(得分:2)
您没有分配names
和models
。您无需从内存中释放或delete
它们。
答案 4 :(得分:2)
正如其他人所回答的那样,这既不是必需的也不是合法的......
delete [] names;
由于您没有new
names
。
这也不是......
for ( int r = 0; r < CAR_SZ; ++r )
{
delete [] models[r];
}
由于您没有new
任何models
。
但是你仍然有一些内存泄漏!
对于您car
编辑并存储在new
cars
中的每个vector
个实例,您需要致电delete
。这是一种方式:
for (std::vector<Car*>::iterator car = cars.begin(), done = cars.end(); car != done; ++car)
{
delete *car;
}
请注意,*
取消引用 iterator
,产生您new
编辑的原始指针。
这种方法的问题在于它会给你留下vector
充满悬空指针的东西。您可以在循环中重置它们,也可以在循环终止后clear()
vector
重置它们。也许更好的方法是:
while (not cars.empty())
{
delete cars.back();
cars.pop_back();
}
每个delete
car
,然后将其指针从vector
移除。
同样地person
new
编辑并存储在people
中的每个while (not people.empty())
{
delete people.back();
people.pop_back();
}
:
delete
根据经验,每个new
应该有一个delete[]
,每个new ... []
应该有一个{{1}}。但你最好还是要了解smart pointers。
答案 5 :(得分:1)
名称和模型未指向堆分配区域。不要删除它。
答案 6 :(得分:1)
您的代码不完整。它不编译。请为您的编译器启用所有警告和调试,例如使用G g++ -Wall -g
如果使用GCC并改进代码,直到没有警告
char * names[] = {"Jim", "Fred", "Harry", "Linda"};
delete [] names;
这是不正确的。您只能delete
通过new
获得的内容。