【问题标题】:Dynamic creation of array of pointers动态创建指针数组
【发布时间】:2013-08-20 12:13:17
【问题描述】:

我正在尝试动态创建一个指针数组。从我读到现在的内容,这可以在 C++ 中通过以下方式完成

CPoint** data_temp;
data_temp = new CPoint*[an_integer]; 

稍后我将添加指向该数组的指针,该数组将指向一个对象。有些像这样,使用for 循环

 CPoint A;
 CPoint* data = &A; //I am using just a single value but data will also be an array
*data_temp[i] = data; // where data is pointer address

现在的问题是,如果要释放内存,我删除指针数组data_temp 是否也会删除原始对象,即A

delete[] data_temp;

我问这个是因为我稍后需要这个对象。

【问题讨论】:

  • 我是唯一一个阅读 OP 在该数组中 放入 的内容的人吗?如果您添加的指针如您在此处显示的那样,则不,您不需要释放元素(因为您从未分配它们;它们是自动的)。您确实需要删除动态分配的指针数组(并且您是)。如果元素也是动态分配内存(即newed),您需要在释放指针数组之前释放它们。不管怎样,我强烈劝阻所有这些,并建议你调查std::vector<>的乐趣
  • @WhozCraig 我在很多场合都看到有人建议不要使用std::vector<>,因为它会减慢程序的速度,而且它分配的内存比实际需要的要大得多。
  • @akash_c 不管这些“人”是谁,他们都错了。没有灵丹妙药,但如果您认为您可以比实现编写者及其在标准库中高度优化和调试的算法更好地管理内存,那么您当然不会在这里发布这样的问题.也就是说,人们很容易低效地使用标准库。但责任几乎总是在用户身上;不是库。它是一种工具,如果使用得当,你将很难击败它。

标签: c++ arrays pointers dynamic-memory-allocation


【解决方案1】:

delete[] 如果数组包含对象本身,则要做的事情:这些对象将被自动销毁。然而,由于这是一个指针数组,你需要这样做来清空它:

for (int i=0; i < num_objects; i++)
{
    delete data_temp[i];
}

delete[] data_temp;

这将释放每个对象指向的内存,然后删除数组本身。

编辑:我刚刚注意到您在堆栈上分配了这些对象。如果你想这样存储它们并自己管理内存,你应该在堆上分配它们,如下所示:

CPoint* A = new CPoint();
data_temp[i] = A;

...或者,如果您在堆栈上已经有一个 CPoint 并且 CPoint 有一个复制构造函数...

data_temp[i] = new CPoint(A);

【讨论】:

    【解决方案2】:

    没有。它不会。应用于指针数组的delete 将删除一个大小为an_integer的数组(在您的情况下)

    如果你真的想释放这些指针指向的内存,你必须经历一个 for 循环

    for(int i = 0; i < an_integer; i++){
        delete data_temp[i];
    }
    //Then deallocate the array
    delete[] data_temp;
    

    这意味着在您的情况下,您最终不会“删除”堆栈上的 A 对象(这会导致未定义的行为)。您只会删除等于计算机上指针大小乘以an_integer 的内存量。

    我会说,在您的情况下,std::vector&lt;A&gt; 会更合理且更好。

    【讨论】:

      【解决方案3】:

      不,不会。您必须分别遍历指针数组和delete 堆分配的对象(即通过调用new 分配的对象)。

      【讨论】:

      • 对象未分配堆栈,正如我在示例中所做的那样,试图使描述简短。它实际上是一个堆分配的数组,然后我使用指针来访问它。
      【解决方案4】:

      您应该使用对它们来说是完美用法的 typedef。

      typedef CPoint* PCPoint;

      之后将 PCPoint 视为数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2017-04-12
        相关资源
        最近更新 更多