C ++: вектор <string>* args = новый вектор <string>(); вызывает SIGABRT - PullRequest
3 голосов
/ 16 февраля 2011

Довольно понятно. Вот метод, который вызывает SIGABRT в строке 'new vector':

vector<string> * Task::arguments() {
    vector<string> *args = new vector<string>(); // CAUSES SIGABRT
    int count = sizeof(_arguments);
    for (int x = 0; x < count; x++) {
        string argument(_arguments[x]);
        args->push_back(argument);
    }
    return args;
}

Обратите внимание, что в других местах я называю эту линию без проблем. Вот список включений в классе Task:

#include <vector>
#include <unistd.h>
#include <string>
using namespace std;
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

Есть мысли?

Ответы [ 4 ]

6 голосов
/ 16 февраля 2011

В этом коде нет реальной ошибки, хотя стиль предполагает, что вам срочно нужна хорошая книга по C ++ .

Как сказал @James в своем комментарии к вопросу, почти наверняка неправильно использовать динамически размещаемый векторный объект, и, безусловно, неправильно не сохранятьэто в умный указатель .
Если вы также сделали это в другом месте своего кода, вы очень , вероятно, испортили кучу , это единственный случай, о котором я могу вспомнить, когда new потерпит крах.

3 голосов
/ 21 февраля 2011

int count = sizeof(_arguments); кажется довольно сомнительным.

sizeof дает вам размер в байтах, а не количество элементов в массиве (за исключением случая, когда каждый элемент равен ровно одному байту, т.е. char).

Приветствия & hth.,

3 голосов
/ 20 февраля 2011

Хорошо, оказывается, проблема не в распределении вектора, а в цикле for (). Замена его на правильную петлю do / while исправила это. GDB просто запутался в том, где была ошибка, и прикрепил ее к векторной линии ... тьфу. Не удивительно, учитывая использование STL.

Кроме того, тем, кто говорит, что динамическое выделение вектора может испортить кучу - почему? Это не имеет никакого смысла; Мне все равно, если я выделю каждый объект динамически; это не должно вызывать проблем. Смешивание объектов в куче и стеке вызывало у меня много проблем в прошлом; единственный способ заставить все работать последовательно - это использовать все объекты кучи.

Если кто-то может объяснить, как объекты стека и кучи могут сосуществовать, я был бы рад это услышать, потому что они никогда не работали вместе для меня. Objective-C имеет смысл, в то время как бессмысленная обработка объектов в C ++ почти всегда вызывает проблемы. К сожалению, мы обязаны использовать C ++, поэтому у меня нет большого выбора ...

2 голосов
/ 16 февраля 2011

Возможно, что-то еще повредило кучу, прежде чем вы сделаете этот вызов.Вы пробовали работать под Valgrind или эквивалент?

...