указатель на вектор: получение ошибки сегментации - PullRequest
0 голосов
/ 22 июня 2011

Я получаю ошибку сегментации в следующем коде.Не могли бы вы помочь мне разобраться?В следующем коде это печатает "хорошо здесь".Как только он освобождает память, он показывает ошибку сегментации.Но почему ?Любое решение?

Любая помощь по этому вопросу будет оценена.

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

class Cube
{
public:
    char *str;

    Cube(int len)
    {
        str = new char[len+1];
    }
    Cube(const Cube &c)
    {
        str = new char[strlen(c.str) + 1];
        strcpy(str, c.str);
    }   
    ~Cube()
    {
        delete [] str;
    }
};

void foo(vector <Cube> *vec)
{
    for (int i = 0; i < 10; i++)
    {
        char in [] = "hello !!";
        Cube *c = new Cube(strlen(in)+1);
        strcpy(c->str, in);
        vec->push_back(*c);
        cout << "ok here" << endl;
        delete [] c;
    }
}

int main()
{
    vector <Cube> vec;

    foo(&vec);  
    return 0;    
}

Ответы [ 4 ]

4 голосов
/ 22 июня 2011

Вы не выполнили правило трех : Cube не реализует правильный оператор назначения копирования.Как уже упоминали другие, вы также не соответствовали new[] с delete, что может закончиться только слезами.

При этом вам не нужно использовать указатели или явное динамическое распределение для всего этого.Вам следует заменить использование new char[] на std::string и не размещать какие-либо объекты Cube в куче.В хорошо написанной программе на C ++ new следует использовать редко, а delete почти никогда не нужно использовать.

Эта программа не имеет явного динамического размещения, имеет тот же результат, что вы ожидаете от вашей программы, но она верна.Обратите внимание, насколько более чистым является код, когда вы не беспокоитесь о динамическом размещении или явном уничтожении вещей самостоятельно!

#include <string>
#include <vector>

struct Cube {
    std::string str;
    explicit Cube(std::string const& s) : str(s) { }
};

void foo(std::vector<Cube>& vec) {
    for (int i = 0; i < 10; ++i) {
        vec.push_back(Cube("hello !!"));
    }
}

int main() {
    std::vector<Cube> vec;
    foo(vec);
}

Убедитесь, что у вас есть хорошая вводная книга по C ++ .

1 голос
/ 22 июня 2011

Вы delete используете массив Cube с здесь:

delete [] c;

Но вы не разместили массив здесь:

Cube *c = new Cube(strlen(in)+1);

Это должно быть просто:

delete c;

0 голосов
/ 28 июня 2011

Вы использовали

delete [] c;

Если c был выделен так:

Cube * c = new Cube[3]; //3 for example

ТОГДА удалить [] c будет уместно. В этом случае вы должны опустить [].

0 голосов
/ 22 июня 2011
delete [] c;

должно быть

delete c;

Кроме того, сам класс Cube сомнителен.Лучше использовать std::string вместо строки в стиле c.

...