删除数组指针?

时间:2011-11-13 08:06:21

标签: c++ memory-management

如何删除已为阵列modelsnames分配的内存?我尝试了所有方法,但是当我运行它时它总是崩溃。

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

7 个答案:

答案 0 :(得分:3)

您没有使用models分配namesnew,因此您无法delete他们。

当函数返回时,两个数组都在堆栈上分配并自动删除。

(字符串)数组的内容(即字符串本身)存储在全局数据段中,根本无法释放。这也是危险的,因为编译器可能在程序的不同位置使用相同的字符串常量。

答案 1 :(得分:2)

models数组和names数组都是静态分配的。您没有使用new创建它们,您不需要删除它们。但是,您应该按如下方式更改其类型:

const char * names[] = {"Jim", "Fred", "Harry", "Linda"};
const char * models[] = { "Festiva", "Ferrarri", "Prius" };

因为它们是指向字符串文字的指针,它们是只读的。

答案 2 :(得分:2)

变量namesmodels不是动态分配的,这些数组中的数据也不是。所以不需要释放它们或它们的内容。

另外,两个vector包含需要免费的数据。

答案 3 :(得分:2)

您没有分配namesmodels。您无需从内存中释放或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获得的内容。