Сбой оператора присваивания в xcode 4, отлично работает в MSVS2010 - PullRequest
0 голосов
/ 14 марта 2012

Я работал над проектом C ++ с Visual Studio 2010, и все было хорошо, но когда я пытался запустить свою программу с xcode 4, это вызывает исключение Bas_Access.Я думаю, что это из-за утечки памяти, но я не уверен, как решить проблему.У меня есть следующая функция:

// Search is my class with x and y as members and here's is a constructor
// that I cretae in my Search.cpp class
Search& Search::operator=( const Search& search )
{
    if(this != &search)
   {
      x = search.x;
      y = search.y;
   }
   return *this;
}

И вот как называется моя функция:

Search searchStart(0,0);
//I created my tempSearch and initialized it with the start Search element
Search tempSearch(searchStart);
//bestSolution is a function that calculates the best neighbour node around the searchStart node, it returns a Search element. And stores it in a list in storage.
Search * tempCurrent=searchStart.bestSolution(&storage);
//Here I call my function
tempSearch=*tempCurrent;    

Я просто создаю новый элемент поиска из существующего элемента, но он дает мнеисключение на

x=search.x;

Отлично работает с visual studio.

РЕДАКТИРОВАТЬ: Я только что добавил код, где вызывается моя функция.Извините, что я не могу предоставить полный код, потому что он действительно длинный.

РЕДАКТИРОВАТЬ: Вот моя функция bestSolution:

Search * searchNode::Search::bestSolution(Storage *storage )
{
        //listResult is a type defined as std::list<Search *> listResult.
    listResult::iterator it, it1;
    listResult tempList;
    //I've initialized the result element at (0,0) because it was creating problems
    // if uninitialized
        Search *result=new Search(0,0);
    //openList is a simple list of Search elements
    if(!storage->openList.empty()){
    for(it=storage->openList.begin();it!=storage->openList.end();it++)
    {
        tempList.push_back((*it));
    }
    tempList.reverse();
    it1=tempList.begin();
    // getDistanceCost is a function that calculates the heuristic distance 
    // between two points and works fine
    int fCost=(*it1)->getDistanceCost();    
    for(it1=storage->openList.begin();it1!=storage->openList.end();it1++)
    {
        if((*it1)->getDistanceCost()<=fCost){
        fCost=(*it1)->getDistanceCost();
        result=(*it1);
    }
    }

    }

    return result;
    }

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Я предполагаю, что bestSolution возвращает указатель на объект, размещенный в стеке. Теперь, когда вы пытаетесь tempSearch=*tempCurrent, вы пытаетесь скопировать значения в этот недействительный указатель, который вызывает неопределенное поведение.

EDIT

Рассматривая реализацию метода bestSolution, я предполагаю, что listResult содержит Search* в качестве его узлов, как вы делаете result=(*it1);. Похоже, объект Search, на который в списке есть указатель, был удален после того, как был вставлен в список. Так что у вас есть в списке указатель invaid. Если вы попытаетесь скопировать что-либо в память, указанную этим недопустимым указателем, ваша программа будет вести себя непредсказуемо.

0 голосов
/ 14 марта 2012

Учитывая предоставленную вами информацию, можно с уверенностью сказать, что проблема заключается в

Search * tempCurrent=searchStart.bestSolution(&storage);

. Он должен возвращать некоторый недопустимый указатель (возможно, NULL).

Этот недопустимый указатель затем передаетсяв качестве параметра search (точнее, &search) для вашего Search::operator=, который затем пытается получить доступ к x (а затем y) члену этого недопустимого указателя (search.x и search.y).

...