2015-06-06 3 views
2

Я следующий C++ кода (сборку на Visual Studio 2013):C++ не может выделить слишком большой массив объектов на куче

MapGraph& MapGraph::operator= (const MapGraph& other) 
{ 
    if (this != &other) 
    { 
     this->primaryCopy = false; 

     this->edges = new int[other.edgeQty]; 
     this->pointers = new int[other.vertexQty + 1]; 
     this->contents = new int[other.vertexQty](); 
     this->weights = new NodeWeight[other.vertexQty]; 

массивов: края, указателей и содержимого созданы без проблем. Но когда дело доходит до , весит творения, это исключает исключение без каких-либо сведений. Исключение происходит в newaop.cpp (не мой файл проекта):

// newaop -- operator new[](size_t) REPLACEABLE 
#include <new> 

void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc) 
    { // try to allocate count bytes for an array 
    return (operator new(count)); 
    } 

/* 
* Copyright (c) 1992-2007 by P.J. Plauger. ALL RIGHTS RESERVED. 
* Consult your license regarding permissions and restrictions. 
V5.03:0009 */ 

Я понятия не имею, что происходит неправильно. Что интересно, если я заменю other.vertexQty (399) меньшим числом. Например:

 this->weights = new NodeWeight[10]; 

Исключение не выбрасывается. Можете ли вы сказать мне, что не так?

+0

Можете ли вы указать значение 'other.vertexQty' в момент исключения? – Flovdis

+0

Пожалуйста, включите 'sizeof'' NodeWeight' в модуле исключения. –

+0

Почему вы используете встроенные массивы и 'новые' в первую очередь? В любом случае, попробуйте отправить MCVE. –

ответ

0

На линии

this->contents = new int[other.vertexQty](); 

у вас есть дополнительный "()" в конце. Поскольку функция:

new[](size_t) 

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

Я полагаю, что его удаление должно работать.

+0

Это не поможет, но спасибо, что указали это. Наверное, ты спас меня от более странных проблем. – ghi

Смежные вопросы