从数组中删除元素并释放分配给它的内存

时间:2016-10-09 13:58:50

标签: c++

如标题中所述,如何在从数组中删除元素后释放分配的内存。这是我的代码:

// VectorGraphic.h
#include "GraphicElement.h"
#include <string>
#ifndef VECTOR_GRAPHIC_H
#define VECTOR_GRAPHIC_H

class VectorGraphic
{
    unsigned int numGraphicElements;
    GraphicElement* pElements;
public:
    VectorGraphic(){        
        numGraphicElements = 0;
        //pElements = new GraphicElement();
        pElements = new GraphicElement[sizeof(GraphicElement)+1];
    }
    ~VectorGraphic()
    {                       
        if (pElements){
            delete[]pElements;
            //pElements = NULL;
        }

    }

    void DeleteGraphicElement(){
        cout << "Deleting a Graphic Element" << endl;
        cout << "Please enter the index of the Graphic Element you wish to delete" << endl;
        int index; 
        cin >> index; 
        if (index > numGraphicElements){
            cout << "Element is not found at specified index";
            return;
        }
        else{
            for (int i = 0; i < numGraphicElements; i++){
                if (i == index){
                    for (int j = i; j < numGraphicElements - 1; j++){
                        pElements[j] = pElements[j + 1];
                    }
                    //delete pElements[numGraphicElements - 1];  //<-Here. This statement shows an error saying "Expression must have pointer type."
                    numGraphicElements--;

                    cout << "Graphic Element deleted successfully" << endl; 
                    break; 
                }
            }

        }

    }
};

#endif

我已经在DeleteGraphicElement()函数中注释了需求/错误所在的行。 我尝试使用delete pElements[numGraphicElements - 1];但是此语句显示错误,指出“表达式必须具有指针类型。”

1 个答案:

答案 0 :(得分:2)

您必须拥有一个指针数组,才能delete数组中的单个元素。

您可以将所有后续元素移回一个地方,但仅使用标准工具无法重新分配new内存。

或者您可以分配一个新数组并复制您想要的所有元素。

但最简单的方法是使用std::vectorstd::vector::erase。这样你就不用担心这个以及你目前正在破坏的rule of three/five/zero