C++ 删除数组指针?
如何删除为阵列C++ 删除数组指针?,c++,memory-management,C++,Memory Management,如何删除为阵列型号,名称分配的内存?我尝试了各种方法,但每次运行时都会崩溃 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+
型号
,名称
分配的内存?我尝试了各种方法,但每次运行时都会崩溃
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;
}
intmain()
{
媒介人;
const int PERSON_SZ=4;
字符*名称[]={“吉姆”、“弗雷德”、“哈里”、“琳达”};
整数年龄[]={23,35,52,59};
for(int i=0;i设置驱动程序(人物[rand()%(人物.size()))];
临时->设置所有者(人员[rand()%(人员.size())];
汽车。向后推(温度);
}
对于(int p=0;p增龄();
}
对于(int c=0;cprint();
}
删除[]个姓名;
对于(int r=0;r
模型数组和名称数组都是静态分配的。您没有使用new
创建它们,您不需要删除它们。但是,您应按以下方式更改其类型:
const char * names[] = {"Jim", "Fred", "Harry", "Linda"};
const char * models[] = { "Festiva", "Ferrarri", "Prius" };
因为它们是指向只读字符串文本的指针。名称和模型没有指向堆分配区域。不要删除它 您没有使用
new
分配模型
和名称
,因此无法删除它们
这两个数组都在堆栈上分配,并在函数返回时自动删除
(字符串)数组的内容(即字符串本身)存储在全局数据段中,根本无法释放。这也很危险,因为编译器可能在程序的不同位置使用相同的字符串常量。变量名称和模型都不是动态分配的,这些数组中的数据也不是动态分配的。因此,没有必要释放它们或它们的内容
另一方面,两个向量包含需要释放的数据。您的代码不完整。它不编译。请为您的编译器启用所有警告和调试,例如,如果使用GCC,请使用g++-Wall-g
,并改进您的代码,直到您没有收到任何警告
char * names[] = {"Jim", "Fred", "Harry", "Linda"};
delete [] names;
这是不正确的。您只能删除通过新建获得的内容您没有分配名称
和型号
。您不需要从内存中释放或删除它们 正如其他人所回答的,这既不是必需的,也不是合法的
delete [] names;
因为您没有新建
名称
这也不是
for ( int r = 0; r < CAR_SZ; ++r )
{
delete [] models[r];
}
请注意,此处的*
取消了对迭代器的引用,从而生成了新的生成的原始指针
这种方法的问题在于,它给您留下了一个充满悬空指针的向量。您可以在循环中重置它们,也可以在循环终止后重置向量。也许更好的办法是:
while (not cars.empty())
{
delete cars.back();
cars.pop_back();
}
它delete
s每个car
,然后从向量中删除其指针
同样地,对于每个人
您新建
并存储在人
中:
while (not people.empty())
{
delete people.back();
people.pop_back();
}
根据经验,每个新都应该有一个delete
,每个新都应该有一个delete[]
。。。[]
。但是您最好了解一下。避免使用指针可以大大简化此代码,并且不容易出错。那么我应该删除什么呢?因为当我在003E3BA8运行它时有14个泄漏对象泄漏对象(尺寸8,00402A43)在003E3C08运行泄漏对象(尺寸18,00432389)在003E3C48运行泄漏对象(尺寸8,00402A43)在003E3C78运行泄漏对象(尺寸18,00432389)在003E3BD8运行泄漏对象(尺寸8,00402A43)在003E3CB8运行泄漏对象(尺寸20,00432389)003E3CF8泄漏对象(尺寸12,00402C3B)003E3D60泄漏对象(尺寸21,00432389)003E3DA0泄漏对象(尺寸12,h28.cpp:182)003E3E08泄漏对象(尺寸18,00432389)003E3E48泄漏对象(尺寸12,00402C3B)***14发现泄漏使用此代码删除向量指针。。。感谢您帮助我(int c=0;cwhile (not people.empty())
{
delete people.back();
people.pop_back();
}