Вы выделили память для 5 указателей, но вы не выделяете ничего, на что указывают эти пять указателей. Предполагая, что вы используете современный 64-разрядный процессор с 8-байтовыми указателями, ваш оператор new
выделяет ровно 40 байт, пять восьмибайтовых указателей. Их исходное содержимое - это случайная, неинициализированная память, и когда вы пишете им, они интерпретируются как указатели на случайные адреса памяти, которые в конечном итоге повреждены тем, что вы читали с std::cin
. Сначала вам повезло, и первые две итерации где-то нацарапали какую-то память, но ваша программа продолжала хромать, но вы выиграли в лотерею с третьей попытки; попадание случайного адреса, который не существует, и segfault.
Хотя вы можете переписать это для правильного распределения, если вы действительно пытаетесь написать C++, а не C, здесь нет причин ничего выделять. Почему вы хотите иметь дело с распределением памяти, когда C++ с радостью сделает это за вас?
std::vector<std::string> text;
for(int i = 0; int < 5; int++)
{
std::cout << std::endl << "Enter a phrase: ";
std::string s;
if (std::getline(std::cin, s).eof())
break;
text.push_back(s);
std::cout << s << std::endl;
}
Поскольку вы выделили массив указателей, но эти указатели не указывают на ничего конкретно. 'cin' не будет выполнять дополнительные ассигнования для вас. –
Это «работает», потому что вы переписываете случайную память, которая, случается, принадлежит вашей программе на первых двух итерациях, но не на третьем. – Cameron