2014-01-30 3 views
0

У меня возникли проблемы с созданием массива строк с использованием calloc. Я не уверен, что массив не создается или нет. Программа падает, когда я пытаюсь установить значение строки:C++ calloc a string array

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

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

ответ

3

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

strs = new string[counts]; 

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

4

Вам необходимо вызвать конструктор объектов, прежде чем вы сможете их использовать. Если вы настаиваете на использовании calloc() вы должны будете использовать размещение нового для создания объекта, например:

#include <new> 
// ... 
new(strs + i) std::string("Hello World!"); 

Обратите внимание, что вы также должны уничтожить объект позже, например:

strs[i].~std::string(); 

обычный способ не использовать функции управления с памятью на всех и лучше использовать new[] в первую очередь:

string* strs = new std::string[counts]; 
// ... 
strs[i] = "Hello World!"; 
// ... 
delete[] strs; 

Операторы памяти C++ имеют дело со строительством/уничтожением по мере необходимости. Чтобы полностью избавиться от явного управления памятью, вы бы просто использовали std::vector<std::string>:

std::vector<std::string> strs(counts);