Проблема Bad_alloc - PullRequest
       12

Проблема Bad_alloc

1 голос
/ 10 марта 2011

моя программа выдает std :: bad_alloc. После отладки я обнаружил, что он добавлен в код

curFinalBucket->points.push_back(p);

где баллы это vector<PPointT>. Перед строкой кода curFinalBucket инициализируется следующим образом.

PFinalBucket curFinalBucket;
curFinalBucket = (FinalBucket*)malloc(sizeof(FinalBucket));

Странно то, что, если я просто введу приведенный выше код в main, не исключение. Но когда я говорю это следующим образом,

void mergeBucket(map<BucketT, vector<PPointT>, Comp> *pMap, IntT numFinalBuckets)
{
...
PFinalBucket curFinalBucket;
curFinalBucket = (FinalBucket*)malloc(sizeof(FinalBucket));
curFinalBucket->points.push_back(p);
}

int testLoadBalancedLSH(IntT num_fbuckets, RealT avgNumPossessedTerms, IntT np, IntT d, char* dataFile)
{
...
mergeBucket(&mapstore, num_fbuckets);
}

int main(int nargs, char **args) {
...
testLoadBalancedLSH(atoi(args[1]), 0.01 * atoi(args[2]), atoi(args[2]), atoi(args[3]), args[4]);
}

это вызовет исключение. Есть идеи, о чем это может быть? заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 10 марта 2011

Я думаю, проблема в том, что вы создаете curFinalBucket с помощью malloc. Это не вызывает конструктор, поэтому внутренний vector<PPointT> не инициализируется, когда вы пытаетесь его использовать.

Я думаю, что FinalBucket - это что-то вроде:

 class FinalBucket{
    public:
       vector<PPointT> points;
 }

points требуется инициализация, которая не происходит, потому что конструктор FinalBucket не вызывается и конструктор vector<PPointT> также не вызывается.

Вы просто выделяете память, но вам нужно вызвать конструкторы для инициализации.

Единственный способ обойти это - использовать new для выделения FinalBucket.

PFinalBucket curFinalBucket;
curFinalBucket = new FinalBucket();
curFinalBucket->points.push_back(p);
1 голос
/ 10 марта 2011

Вы должны использовать new FinalBucket для выделения динамической памяти вместо malloc. Новый оператор вызовет конструктор FinalBucket , в котором вектор будет инициализирован.

1 голос
/ 10 марта 2011

(FinalBucket*)malloc(sizeof(FinalBucket)); выделяет память для объекта размером FinalBucket, но на самом деле он не создает окончательного сегмента.Вы должны использовать new FinalBucket() для этого.

Кроме того, как примечание к стилю, скрытие указателей за макросами / typedefs, такими как PFinalBucket, затрудняет чтение вашего кода.Просто напишите FinalBucket * вместо этого, это намного понятнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...