【问题标题】:Dynamic allocation with DOUBLE POINTERS双指针动态分配
【发布时间】:2011-04-19 19:40:05
【问题描述】:

我有一个基类 Toy 和派生类 Toy_remote_car 和 Toy_battery_car。

我正在这样做:

Toy** ptr;
ptr=new Toy*;
ptr[0]=new Toy_remote_car[1];
ptr[1]=new Toy_battery_car[1];/*this is completely wrong according to my teacher because i never created ptr[1]. Instead this is a misuse of memory according to him.*/

上面的代码(ptr=new Toy*) 正在创建一个Toy(ptr[0]) 类型的单个指针,其中包含派生类Toy_remote_car 的对象。

现在我想写这样的代码:

->不应预定义玩具类型指针的数量。

->相反,我会调用 add_toy 函数,该函数将创建一个指向我想要的对象类型的 ptr。此外,如果我再次调用 add_toy 函数,它不应该将数据分配给 previos ptr,但它应该创建一个新的 ptr。以下约定可能会有所帮助:

ptr[0]=new Toy_remote_car[1];
/*we want to add more toys so add_toy function called. A check is applied.*/
/*The check checks that ptr[0] already contains a value so it creates another pointer ptr[1]*/
ptr[1]=new Toy_battery_car[1];

->此外,我将能够访问所有以前的数据。简而言之:

ptr[0]//contains one type of data.
ptr[1]//contains another type.
//and so on

->所以它会在添加新玩具时自动创建一个玩具类型的指针(ptr)。

我希望我已经很好地解释了我试图在这段代码中实现的内容。

请在这方面帮助我。

谢谢

【问题讨论】:

  • 为什么你在免费商店分配指针?!?!

标签: c++ pointers memory-leaks memory-management new-operator


【解决方案1】:
Toy **ptr = new Toy *[n];

其中n 包含您想要的Toy 指针的数量。增长数组很困难,但可以做到:

// Add x to toypp, an array of n pointers
// very stupid, linear-time algorithm
Toy **add_toy(Toy *x, Toy **toypp, size_t n)
{
    Toy **new_toypp = new Toy*[n+1];

    // copy the old array's contents
    for (size_t i=0; i<n; i++)
         new_toypp[i] = toypp[i];
    toypp[n] = x;

    // clean up
    delete[] toypp;

    return new_toypp;
}

注意如果分配失败,旧的toypp 和其中的所有指针都不会被清除。真的,如果您想要一个增长的数组,请改用vector&lt;Toy*&gt;

vector<Toy*> toy_ptrs(n);

并使用push_back 添加玩具。

不要忘记delete 每一个Toy*,第一种方法是delete[] Toy**

可以通过继承来处理各种数据。

【讨论】:

  • 而且 n 无论如何都是未知的,因为玩具店没有具体数量的玩具。
  • @Spoilt:阅读向量,每本 C++ 书籍都应该包含它们。简短的故事是:它们是为您执行(部分)内存管理并且可以动态增长的数组。
  • @Spoilt,请忽略使用vector 的建议,直到您在课堂上了解它。在开始使用简单快捷方式之前,最好先了解难懂的概念。
  • 好的,我会读的。但请确认一件事。在调用 add_toy 时最初 n=1。然后随着一次又一次地调用 add_toy,n 每次增加 1。但是 ptr[0]、ptr[1] 等保持不变。现在随着商店中玩具数量的增加,ptr 的数组也在增加。我是朝着正确的方向前进还是你的解释做了不同的事情??
  • @Mark Ransom 那么你认为我该怎么做??
【解决方案2】:

我用非常简单的逻辑编写了这段代码。这完全正常。请看一看并发表意见。

void add_toy_var()
{   
    temp=NULL;
    temp=tptr;
    tptr=NULL;
    delete[] tptr;
    C1.count1++;
    tptr=new Toy*[C1.count1];
    if(temp!=NULL)
    {
        for(int i=0; i<(C1.count1-1); i++)
        {
            tptr[i]=temp[i];
        }
    }


    int choice2;
    cout<<"Which Toy you want to add?"<<endl;
    cout<<"1. Remote Toy Car"<<endl;
    cout<<"2. Batt powered toy car"<<endl;
    cout<<"3. Batt powered toy bike"<<endl;
    cout<<"4. Remote control toy heli"<<endl;
    cin>>choice2;
    if(choice2==1)
    {                       
        tptr[C1.count1-1]=new Toy_car_rem[1];
        tptr[C1.count1-1]->set_data();
    }
    else if(choice2==2)
    {
        tptr[C1.count1-1]=new Toy_car_batt[1];
        tptr[C1.count1-1]->set_data();
    }
    else if(choice2==3)
    {
        tptr[C1.count1-1]=new Toy_bike_batt[1];
        tptr[C1.count1-1]->set_data();
    }
    temp=NULL;
    delete[] temp;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多