У меня возникают проблемы при создании массива строк с использованием calloc. Я не уверен, если массив не создается или нет. Программа падает, когда я пытаюсь установить строковое значение:
using namespace std;
int main(void){
int counts;
string* strs;
cout<<"Enter a number: ";
cin>>counts;
cout<<endl;
strs=(string*)calloc(counts,sizeof(string));
for(int i=0;i<counts;i++){
strs[i] = "Hello World!";
cout<<i<<") "<<strs[i]<<endl;
}
return 0;
}
Я также пытался использовать:
strs[i].asign("Hello World");
но я все еще получаю ошибку Windows, что «ошибка вызвала корректную работу программы»
Любая помощь будет отличной!
Как string
это класс C ++, который требует правильной инициализации, вы не можете calloc
это, вы должны new
Это.
strs = new string[counts];
Вы, вероятно, не должны выделять массив строк в первую очередь — почему бы не использовать std::vector<string>
?
Вам нужно вызвать конструктор объектов, прежде чем вы сможете их использовать. Если вы настаиваете на использовании calloc()
вам нужно использовать размещение new для создания объекта, например:
#include <new>
// ...
new(strs + i) std::string("Hello World!");
Обратите внимание, что вам также потребуется уничтожить объект позже, например:
strs[i].~std::string();
Обычный способ не использовать функции управления памятью C на всех и скорее использовать new[]
на первом месте:
string* strs = new std::string[counts];
// ...
strs[i] = "Hello World!";
// ...
delete[] strs;
Операторы памяти C ++ имеют дело с конструкцией / уничтожением по мере необходимости. Чтобы полностью избавиться от явного управления памятью, вы бы просто использовали std::vector<std::string>
:
std::vector<std::string> strs(counts);