2016-10-15 5 views
0

Решенных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; 
+2

Что вы хотите сделать - это разделение проблем. Ваш класс не должен управлять динамическими массивами, он должен использовать то, что делает управление для вас. Это что-то «std :: vector». – GManNickG

+1

Что такое [Правило трех] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? Прочтите ссылку и узнайте – user4581301

ответ

1

При удалении pElements он удаляет каждый GraphicElement объект там. Когда вы удаляете GraphicElement, он удаляет свой член pLines. Это нормально, за исключением случаев, когда вы копируете данные с pElements в newElements, вы копируете только значение указателя pLines. Так что все старые GraphicElement объектов в pElementsи те, что в newElements указывают на то же местоположение. Затем вы удаляете это местоположение, давая вам неопределенное поведение, которое вы видите. Вам нужно сделать глубокую копию.

+0

Спасибо, я понял! – bksy

Смежные вопросы