PDA

View Full Version : سوال: خطای exception: std::bad_alloc at memory location



alireza323
دوشنبه 12 تیر 1391, 16:45 عصر
سلام

دوستان من یه برنامه دارم که توش از اشاره گرها زیاد استفاده کردم.تو برنامه تا جایی که شده فضاهای تخصیص داده شده رو آزاد کردم..لی خب خیلی هاشم نشده، چون تو اجرا نیاز داشتم.
برنامه من یه فایل اسمبلی رو به عنوان ورودی میگیره، و از رو دستورات این فایل گراف وابستگی اون رو میسازه.

وقتی گراف ساخته شد، من یه تابع دارم که این تابع کارش ساده کردن این گراف هستش، که تو اجرای این تابع وسطای کار خطای exception: std::bad_alloc at memory location رخ میده! کد تابعی که کار ساده کردن رو انجام میده کد زیر هست. در واقع خطا وقتی که از "=operator" استفاده میکنم رخ میده. که این operator رو خودم تو کلاس Node پیاده کردم، که کد اون رو هم پایین میذارم.


vector<LinkedList*> Graph::GraphReduction(vector<LinkedList*> list)
{
LinkedList *l1;
LinkedList *l2;
Node* node1 = NULL;
Node* node2 = NULL;
Node* temp = NULL;
int counter = 0, counter2 = 0, j = 0, headIndex = -1, k = 0;
bool onIncomingVertex = false;
//remove vertex with 1 incoming and 1 outgoing and vertex with only 1 incoming edge and vertex with only 1outgoing edge
for(int i = 0; i < list.size(); i++)
{
onIncomingVertex = false;
headIndex = -1;
counter2 = 0;
if(!compare(list[i]->first->type, "dll"))
{
temp = node1 = list[i]->first->E.next;
if(node1 != NULL)
{
for(k = 0; k < list[i]->nodesNo - 1; k++)
{
counter = 0;
headIndex = -1;
for(j = 0; j < list.size(); j++)
{
l1 = list[j];
l2 = list[i];
node2 = list[j]->first->E.next;
if(node2 != NULL)
{
for(int l = 0; l < list[j]->nodesNo - 1; l++)
{
if(node2->operator = (node1))
{
counter++;
}
if(node1->operator = (list[j]->first))
{
headIndex = j;
}
if(node2->operator = (list[i]->first))
{
onIncomingVertex = true;
counter2++;
}
if(node2->E.next != NULL)
{
node2 = node2->E.next;
}
}
}
}
if(counter < 2)
{
break;
}
temp = node1;
if(node1->E.next != NULL)
{
node1 = node1->E.next;
}
}

if(counter < 2)
{
if(list[i]->first->type != "condjump")
{
if(temp != NULL && (!compare(temp->type, "dll")))
{
list[i]->delNode(temp);
if(headIndex > - 1)
{
if(list[headIndex]->first->E.next != NULL)
{
list[i]->addNode(list[headIndex]->first->E.next, "");
}
delete list[headIndex];
list.erase(list.begin() + headIndex);
i--;
continue;
}
}
}
}
}
//Remove vertex with only 1 incoming edge
if(!onIncomingVertex && counter2 < 1 && list[i]->nodesNo <= 2 && list[i]->first->type != "condjump")
{
delete list[i];
list.erase(list.begin() + i);
i--;
continue;
}
}
}
}


کد =operator به صورت زیر هستش

bool Node::operator =(Node* node)
{
string str = node->type;
char * nodeType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeType);
nodeType[str.size()] = '\0';

str = node->source;
char * nodeSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeSource);
nodeSource[str.size()] = '\0';

str = node->destination;
char * nodeDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), nodeDestination);
nodeDestination[str.size()] = '\0';

str = type;
char * tempType = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempType);
tempType[str.size()] = '\0';

str = source;
char * tempSource = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempSource);
tempSource[str.size()] = '\0';

str = destination;
char * tempDestination = new char[str.size() + 1];
std::copy(str.begin(), str.end(), tempDestination);
tempDestination[str.size()] = '\0';

if(!(strcmp(nodeType,tempType)) && !(strcmp(nodeSource, tempSource)) && !(strcmp(nodeDestination, tempDestination)))
{
return true;
}
else
{
return false;
}
}


دوستان لطفا اگه میدونید مشکل از کجاسن، کمکم کنید.5روزه که با این کد دارم ور میرم و نمیدونم مشکل چیه:| تو نت هم که سرچ کردم، گفتن رم کم میاره، ولی نفهمیدم یعنی چی

Salar Ashgi
دوشنبه 12 تیر 1391, 21:55 عصر
دوست عزیز خوب طبیعیه دیگه در overload کردن عملگر = ، این همه آرایه پویا
پدر RAM رو در میاره !!

alireza323
سه شنبه 13 تیر 1391, 01:25 صبح
دوست عزیز خوب طبیعیه دیگه در overload کردن عملگر = ، این همه آرایه پویا
پدر RAM رو در میاره !!
درست میگید دوست عزیز، مشکل از همینجا بود و من بهش توجه نکرده بودم! ممنون از اینکه پاسخ دادین