2015-07-01 2 views
0

Решение Ниже В течение почти года я думал, что полностью понял указатели, и теперь он терпит неудачу. Я отправлю весь файл, если он понадобится.Проблемы с C++ при переходе к функции

// Test Structure and Function 
struct You { 
    int x; 
    int y; 
    string str; 
}; 

bool Show(You* showValue); 


// Should (delete) in whatever way possible and update its address to the  "You* update" you sent 
void Update(You* update, int n) { 

    // Create a new "You" 
    You* youTwo = new You(); 
    youTwo->x = 55; 
    youTwo->y = 43; 
    youTwo->str = "Twin"; 

    // Update? 
    update = youTwo; 

    return; 
}; 




bool Show(You* showValue) { 
    cout << "Show:" << endl; 
    cout << showValue->x << '\t'; 
    cout << showValue->y << '\t'; 
    cout << showValue->str << '\t'; 
    cout << endl << endl; 
}; 



int main(int argc, char** argv) { 

    // Original You 
    You* currentYou = new You(); 
    currentYou->x = 1; 
    currentYou->y = 2; 
    currentYou->str = "You"; 

    // Update the current you to a new you 
    Show(currentYou); // works 
    Update(currentYou, 5); // no compile errors 
    Show(currentYou); // shows initial values instead of the updated 

    return 0; 
}; 

Update функция есть, где проблема. Мои намерения - удалить (или избавиться) от оригинала. Замените его на new You() и сделайте с ним.

+1

Хорошо, поздравляю с решением проблемы. Между тем, если вы сохраняете исходный проблемный код и предоставляете решение отдельно, это будет более полезно для других читателей. –

ответ

0
#include <iostream> 
#include <string> 
using namespace std; 



// Test Structure and Function 
    struct You { 
    int x; 
    int y; 
    string str; 
}; 


bool Show(You* showValue); 



// Should (delete) in whatever way possible and update its address to the "You* update" you sent 
void Update(You*& update, int n) { 

// Clean Up 
delete update; 

// Create a new "You" 
You* youTwo = new You(); 
youTwo->x = 55; 
youTwo->y = 43; 
youTwo->str = "Twin"; 

// Update address 
update = youTwo; 

return; 
}; 




bool Show(You* showValue) { 
cout << "Show:" << endl; 
cout << showValue->x << '\t'; 
cout << showValue->y << '\t'; 
cout << showValue->str << '\t'; 
cout << endl << endl; 
}; 



int main(int argc, char** argv) { 

// Original You 
You* currentYou = new You(); 
currentYou->x = 1; 
currentYou->y = 2; 
currentYou->str = "You"; 

// Update the current you to a new you 
Show(currentYou); 
Update(currentYou, 5); 
Show(currentYou); 

delete currentYou; 
return 0; 
}; 

Утечка памяти фиксируется (в delete «были добавлены с,), а указатель является указателем-ссылок в настоящее время. Прекрасно работает.

+0

Что делать, если есть другая ссылка на старое 'update' при вызове' Update'? Вы полностью аннулируете его, не зная – WorldSEnder

3

Вы передаете указатель на You по значению void Update(You*,int). Таким образом, update = youTwo; не влияет на currentYou.

Изменить Updatevoid Update(You*& update, in n) { //... и прочитать по ссылкам.

Btw, у вас есть утечка памяти. Вы обновляете указатель, но никогда не освобождаете старый currentYou или новый currentYou. Вы должны использовать «умные указатели» (явно shared_ptr<You>), чтобы очистить все позади вас, без необходимости звонить delete каждый раз, когда вы сами.

+0

спасибо, утечка памяти, которую я фактически ушел, я пытался это исключить. Я попробую посоветовать. –

+0

@EvanCarslake, вы должны «удалить обновление» перед тем, как назначить 'youTwo', чтобы удалить предыдущий' You'. Кроме того, это должно быть хорошо (после форматирования) – WorldSEnder

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