Я изучаю cpp самостоятельно (надеюсь, я уже не отпугнул вас), я понимаю, что такое указатель или ссылка, и я думаю, что получаю ссылку на указатель является.Удаление ссылки на указатель вызывает ошибку
Я написал код, который происходит сбой в delete[] ranking;
:
open(file)
это простая функция, чтобы открыть текстовый файл, который содержит строку и 3 целых чисел в каждой строке, которая входит в структуру zuzel
:
void read_file(std::ifstream & file, zuzel *& ranking)
{
if(!open(file))
return; //exit function if reading a file failed
int size = 1;
while(!file.eof())
{
zuzel * update = new zuzel[size];
if(ranking != NULL) memcpy(update, ranking, (size-1)*sizeof(*ranking)); //copy existing contents
file >> update[size - 1].nazwa >> update[size - 1].zawodnicy >> update[size - 1].mecze >> update[size - 1].punkty;// add a new team
delete[] ranking; //delete old data
std::cout << "tst"; //just to see if it crashes
ranking = update;
size++;
}
}
int main()
{
zuzel * rank;
std::ifstream file;
read_file(file, rank);
return 0;
}
я узнал, что вы не должны удалить то, что вы не сделали новый, но, например, что код не откажет:
void funk(int *& a)
{
delete[] a;
}
int main()
{
int a[3] = {3, 4, 6};
int * p = a;
funk(p);
return 0;
}
Как я могу исправить эту ошибку? Я был бы обязан за какое-то простое объяснение, почему он ведет себя таким образом.
«Не сбой» не означает, что код действителен. – Mat
'Я узнал, что вы не должны удалить что-то, что вы не сделали, но, например, этот код не сработает. Нет никакой гарантии, что плохой код на C++, подобный этому, выйдет из строя. – PaulMcKenzie
'Я сам изучаю cpp' Тогда я могу посоветовать вам научиться использовать' std :: vector' вместо написания низкоуровневого C для имитации динамического массива. – PaulMcKenzie