gpt4 book ai didi

c++ - 按值传递对象时出现断言错误——这是我的复制构造函数?

转载 作者:行者123 更新时间:2023-11-28 06:15:46 25 4
gpt4 key购买 nike

大家好!

我刚刚写完一个二维迷宫(类是一个名为“迷宫”的 ADT——多么原始),它使用动态内存分配。我将迷宫传递给另一个类的方法,我将其命名为“MazeSolver”,它使用递归和回溯来解决迷宫问题。好消息是,当我通过引用传递对象时,我的代码编译得很好。我不知道是好是坏的消息是,如果我尝试按值将 Maze 传递给 MazeSolver,我会收到断言错误。

鉴于错误仅在我按值传递时发生,我只能假设它与我的复制构造函数有关。在继续之前,这里有一些关于代码的信息:

迷宫由正方形组成。每个正方形都由一个名为 SquareData 的结构表示。

      struct SquareData 
{
//data fields for the struct (NO POINTERS)
}

我决定用一个 SquareData 指针 vector 来表示整个迷宫(这个 vector 在类“Maze”的私有(private)部分中)。

vector<SquareData*> squares;

我的析构函数的实现看起来像这样(最后一次引用 Player 类的调用只是消除了我声明为该类的静态变量的悬空指针,我已经指向迷宫了。我认为这不重要考虑这个问题,但毕竟我是 C++ 的新手,你们中的一个人可能认为它可能是,所以我将它包含在“hmmms”中):

// clears maze of its contents
void Maze::clear() {
int totalSquares = squares.size();
for (int loopVar = 0; loopVar < totalSquares; loopVar++)
{
delete squares[loopVar]; // deallocate memory by deleting the square structure
squares[loopVar] = nullptr; // eliminate dangling pointer
} // vector takes care of itself
} // end clear

Maze::~Maze(){
//clear the maze of contents (vector is full of pointers whose memory is on the heap)
clear();
//vector safe to deallocate itself now
Player::setMaze(nullptr); // remove the pointer from player
}

我已经在 header 中声明了复制构造函数,如下所示:

/** Copy Constructor */
Maze(const Maze& myMaze);

尝试实现:

/** copy constructor */
Maze::Maze(const Maze& myMaze){
/** Initialize Constants */
mazeLength = myMaze.mazeLength;
mazeWidth = myMaze.mazeWidth;
exitRow = myMaze.exitRow;
exitCol = myMaze.exitCol;
entRow = myMaze.entRow;
entCol = myMaze.entCol;
/** copy the vector of pointers*/
for (int loopVar = 0; loopVar < myMaze.squares.size(); loopVar++)
{
squares.push_back(myMaze.squares[loopVar]);
}
} // end copy constructor

以下是我试图理解问题所在的方式:

我为迷宫类编写了这个 vector 显示函数。

void Maze::vectorDisplay() const {
for (int loopVar = 0; loopVar < squares.size(); loopVar++)
{
cout << "Vector Index: " << loopVar << endl;
cout << "Pointer: " << squares[loopVar] << endl;
cout << "Row: " << squares[loopVar]->Row << endl;
cout << "Col: " << squares[loopVar]->Col << endl;
cout << "State: " << squares[loopVar]->State << endl;
}
} //end vectorDisplay

并发现在驱动程序中执行以下操作时 vector 显示正确:

    Maze myMazeObject(// parameters);
myMazeObject.vectorDisplay();

并且将产生没有投诉的输出。

但是现在如果我在按值传递时尝试使用这样的代码:

Maze myMazeObject(// parameters);
MazeSolver myMazeSolver;
myMazeSolver.someMazeSolverMethod(myMazeObject);

其中 someMazeSolverMethod 有行 myMazeObject.vectorDisplay(); 我在打印 vector 中的最后一个元素时收到断言错误。

我想说这是我的错,我的复制构造函数是一个 p.o.s.如果有任何见解,请告诉我如何解决它以及我将来可以做些什么!

感谢您抽出宝贵的时间阅读,更感谢您愿意回答!

-J

最佳答案

这是你的问题。

    squares.push_back(myMaze.squares[loopVar]);

基本上每个迷宫都有一个充满相同指针的 vector 。当迷宫的一个拷贝超出范围时,它将删除所有指针。因此,另一个迷宫现在有一组无效指针。

几个解决方案。

  1. 不要使用指针。

除非您 SquareData 是多态的,否则似乎没有理由保留指针。

 std::vector<SquareData> squares;
  1. 如果您希望迷宫的每个拷贝都指向相同的方 block 。

然后使用共享指针。这将记录对每个 SquareData 的引用数量,因此仅当它们真正超出范围时才删除它们。

 std::vector<std::shared_ptr<SquareData>> squares;
  1. 最没有吸引力(可能不需要)。

更改代码以实际将指针内容复制到新对象中。

squares.push_back(new SquareData(myMaze.squares[loopVar]));

关于c++ - 按值传递对象时出现断言错误——这是我的复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30360437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com