РешенныхC++ - Изменение размера динамического массива
У меня возникли проблемы с изменением размеров массива указателей, в основном за последние несколько строк функции 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;
}
И следующая функция AddGraphicElement() в VectorGraphic класс:
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[] pElements;
Я полагаю, что я спрашиваю, как я правильно использовать delete [] в моей программе?
Спасибо!
EDIT: РЕШИТЬ, НОВЫЙ КОД ДЛЯ LOOP НИЖЕ
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;
Что вы хотите сделать - это разделение проблем. Ваш класс не должен управлять динамическими массивами, он должен использовать то, что делает управление для вас. Это что-то «std :: vector». – GManNickG
Что такое [Правило трех] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? Прочтите ссылку и узнайте – user4581301