Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除数组指针?_C++_Memory Management - Fatal编程技术网

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(); }