C++: vector * args = new vector (); вызывает SIGABRT


Довольно понятно. Вот метод, который вызывает SIGABRT на линии "новый вектор":

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;
}
Обратите внимание, что в другом месте я называю эту точную линию без каких-либо проблем. Вот список включенных в класс задач:
#include <vector>
#include <unistd.h>
#include <string>
using namespace std;
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

Есть какие-нибудь мысли?

4 3

4 ответа:

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

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

Ура & ХТ.,

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

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

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

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

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

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