gpt4 book ai didi

C++ - 调整动态数组的大小

转载 作者:行者123 更新时间:2023-11-28 05:28:23 25 4
gpt4 key购买 nike

已解决

我在调整指针数组的大小时遇到​​问题,主要是 AddGraphicElement() 函数的最后几行。

我对 VectorGraphic 有以下类定义:

unsigned int numGraphicElements;
GraphicElement* pElements;
public:

VectorGraphic();
~VectorGraphic()
{
if (pElements)
delete[]pElements;
}
void AddGraphicElement();
void DeleteGraphicElement();
void ReportVectorGraphic();

GraphicElement 的以下类定义:

static const int SIZE = 256;
public:
unsigned int numLines;
Line* pLines;
char name[SIZE];
GraphicElement()
{
numLines = 0;
pLines = nullptr;
}
~GraphicElement()
{
if (pLines)
delete []pLines;
}

VectorGraphic 类中的以下函数 AddGraphicElement():

unsigned int numLines;
char name[256];
cout << "Adding a Graphic Element" << endl;

//Name input
cout << "Please enter the name of the new GraphicElement(<256 characters): ";
//Flush cin so it doesnt skip getline
cin.ignore();
cin.getline(name,sizeof(name));

//Line input
cout << "How many lines are there in the new GraphicElement? ";
cin >> numLines;

//Allocate memory for line(s)
Line* pLines = new Line[numLines];

for(int i=0;i<numLines;i++)
{
//Start point input
cout << "Please enter the x coord of the start point of line index " << i << ": ";
cin >> pLines[i].start.x;
cout << "Please enter the y coord of the start point of line index " << i << ": ";
cin >> pLines[i].start.y;
//End point input
cout << "Please enter the x coord of the end point of line index " << i << ": ";
cin >> pLines[i].end.x;
cout << "Please enter the y coord of the end point of line index " << i << ": ";
cin >> pLines[i].end.y;
}

//Allocate new size for GraphicElement*
GraphicElement* newElements = new GraphicElement[numGraphicElements+1];

//Copy old elements to new pointer
for(int i=0;i<numGraphicElements;i++)
{
newElements[i] = pElements[i];
newElements[i].pLines = pElements[i].pLines;
}

//Assign new element to last index
strcpy(newElements[numGraphicElements].name, name);
newElements[numGraphicElements].numLines = numLines;
newElements[numGraphicElements].pLines = pLines;

//Re-assign the pointer and increment number of elements
delete[] pElements;
pElements = newElements;
numGraphicElements++;

最后 3 行之前的所有内容似乎都运行良好。如果我打印 newElements 的内容(在删除和重新分配之前),我的所有数据都在那里。但是,如果我在删除和重新分配后打印它,我的数据就会丢失(垃圾值 -17891602 在那里)。

我认为我没有正确使用 delete[],因为删除这一行可以让我的程序工作,尽管存在内存泄漏:

delete[] pElements;

我想我想问的是如何在我的程序中正确使用 delete[]?

谢谢!

编辑:已解决,下面循环的新代码

    strcpy(newElements[i].name, pElements[i].name);
newElements[i].numLines = pElements[i].numLines;

Line* newLines = new Line[newElements[i].numLines];
newLines->start.x = pElements[i].pLines->start.x;
newLines->start.y = pElements[i].pLines->start.y;
newLines->end.x = pElements[i].pLines->end.x;
newLines->end.y = pElements[i].pLines->end.y;

newElements[i].pLines = newLines;

最佳答案

当您删除 pElements 时,它会删除其中的每个 GraphicElement 对象。当您删除 GraphicElement 时,它会删除其 pLines 成员。这很好,除非您将数据从 pElements 复制到 newElements 中,您只复制了 pLines 指针值。所以 pElements 中的所有旧 GraphicElement 对象 newElements 中的对象 都指向相同的位置。然后您删除该位置,为您提供您所看到的未定义行为。你需要做一个深拷贝。

关于C++ - 调整动态数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com