c ++ вызывает массив строк

У меня возникают проблемы при создании массива строк с использованием 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, что «ошибка вызвала корректную работу программы»

Любая помощь будет отличной!

0

Решение

Как string это класс C ++, который требует правильной инициализации, вы не можете calloc это, вы должны new Это.

strs = new string[counts];

Вы, вероятно, не должны выделять массив строк в первую очередь — почему бы не использовать std::vector<string>?

3

Другие решения

Вам нужно вызвать конструктор объектов, прежде чем вы сможете их использовать. Если вы настаиваете на использовании 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);
4