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 ответа:
int count = sizeof(_arguments);
кажется довольно сомнительным.
sizeof
дает размер в байтах, а не количество элементов массива (за исключением случая, когда каждый элемент равен ровно одному байту, т. е.char
).Ура & ХТ.,
В этом коде нет реальной ошибки, хотя стиль предполагает, что вам срочно нужна хорошая книга на C++ .
Как сказал @James в своем комментарии к вопросу, почти наверняка неправильно использовать a динамически распределяется вектор объекта, и это, конечно, неправильно, чтобы не держать его в умный указатель.
Если вы также сделали это в другом месте вашего кода, Вы очень скорее всего испортили кучу , это единственный случай, который я могу придумать, когдаnew
рухнет.
Хорошо, оказывается, проблема была не с выделением вектора, а скорее внутри цикла for (). Заменив его на правильный цикл do/while, исправил его. GDB просто запуталась в том, где была ошибка, и застряла на векторной линии... тьфу. Не удивительно, учитывая использование STL, хотя.
Кроме того, тем, кто говорит, что динамическое выделение вектора может испортить кучу - почему? Это не имеет смысла; мне все равно, если я выделяю каждый отдельный объект динамически; делать это не следует. вызывать проблемы. Смешивание объектов кучи и стека вызывало у меня много проблем в прошлом; единственный способ заставить вещи работать последовательно-это использовать все объекты кучи.
Если кто-то может объяснить, как объекты стека и кучи могут сосуществовать, я был бы рад услышать это, потому что они никогда не работали вместе для меня. Objective-C имеет совершенный смысл, в то время как бессмысленное обращение C++с объектами почти всегда вызывает проблемы. К сожалению, мы должны использовать C++, поэтому он оставляет меня без большой выбор...