как коректно создать двумерный динамический массив строк и очистить память в с++

пробовал этот вариант:

string** strings = new (string*);

//формируем массив
for (int i = 0; i < 5; i++)
    *(strings + i) = new string;

//заполнаем массив
for (int i = 0; i < 5; i++)
    getline(cin, **(strings + i));

cout << endl << endl;
cout << "strings:" << endl;
for (int i = 0; i < 5; i++)
    cout << i << '.' << **(strings + i) << endl;


for (int i = 0; i < 5; i++)
    delete *(strings + i);

delete strings;

выдает ошибку. В чем моя ошибка? Как ее исправить? Что лучше использовать?


Ответы (2 шт):

Автор решения: n1tr0xs
// создание
int size_1 = 2, size_2 = 2;
string **arr = new string*[size_1];
for(int i=0; i<size_2; ++i)
    arr[i] = new string[size_2];

// заполнение
for(int i=0; i<size_1; ++i)
    for(int j=0; j<size_2; ++j)
        getline(cin, arr[i][j]);

// вывод
for(int i=0; i<size_1; ++i)
    for(int j=0; j<size_2; ++j)
        cout << arr[i][j] << '\n';

//очистка памяти
for(int i=0; i<size_2; ++i)
    delete[] arr[i];
delete[] arr;

Но обычно блоки "создание" и "заполнение" сливают в один:

// создание и заполнение
int size_1 = 2, size_2 = 2;
string **arr = new string*[size_1];
for(int i=0; i<size_2; ++i){
    arr[i] = new string[size_2];
    for(int j=0; j<size_2; ++j)
        getline(cin, arr[i][j]);
}

// вывод
for(int i=0; i<size_1; ++i)
    for(int j=0; j<size_2; ++j)
        cout << arr[i][j] << '\n';

//очистка памяти
for(int i=0; i<size_2; ++i)
    delete[] arr[i];
delete[] arr;
→ Ссылка
Автор решения: Fonar Siny

Как-то так?

#include <iostream>
#include <limits>
#include <string>
#include <vector>

int main()
{
    std::size_t arrays = 0;
    std::size_t idx = 0;
    std::string input;

    std::cout << "Number of string arrays:" << std::endl;
    std::cin >> arrays;
    std::vector<std::vector<std::string> > strings( arrays );

    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

    for( ; idx < strings.size(); ++idx ) {
        std::cout << "Input set " << (idx + 1) << ", empty string to end:" << std::endl;
        while( 1 ) {
            std::getline( std::cin, input );
            if( input.empty() ) {
                break;
            }
            strings[idx].emplace_back( std::move( input ) );
        }
    }

    idx = 0;
    for( const auto& i : strings ) {
        std::cout << "Set " << ++idx << " size: " << i.size() << std::endl;
        for( const auto& j : i ) {
            std::cout << " " << j << std::endl;
        }
    }
}
→ Ссылка