问题描述
这是我的代码。当我退出移动构造函数时,调试器会进入看起来很奇怪的函数(我是编程新手)和标准 c++ 库的 GNU 扩展文件。
#include <iostream>
#include <vector>
using namespace std;
class Move {
private:
int *data;
public:
void set_data_value(int d) { *data = d; }
int get_data_value() { return *data; }
// Constructor
Move(int d);
// copy Constructor
Move(const Move &source);
Move(Move &&source);
// Destructor
~Move();
};
Move::Move(int d) {
data = new int;
*data = d;
cout << "Constructor for: " << d << endl;
}
Move::Move(const Move &source)
: Move {*source.data} {
cout << "copy constructor - deep copy for: " << *data << endl;
}
//Move ctor
Move::Move(Move &&source)
: data {source.data} {
source.data = nullptr;
cout << "Move constructor - moving resource: " << *data << endl;
}
Move::~Move() {
if (data != nullptr) {
cout << "Destructor freeing data for: " << *data << endl;
} else {
cout << "Destructor freeing data for nullptr" << endl;
}
delete data;
}
int main(){
vector<Move> vec;
vec.push_back(Move{10});
vec.push_back(Move{20});
vec.push_back(Move{30});
vec.push_back(Move{40});
vec.push_back(Move{50});
vec.push_back(Move{60});
vec.push_back(Move{70});
vec.push_back(Move{80});
return 0;
}
我想避免使用这些文件和函数,因为我还不知道它们是什么。你有什么解决方案吗?谢谢。
解决方法
阅读 GDB 的文档。使用 GCC 作为 g++ -Wall -Wextra -g
仔细阅读 GDB breakpoints,例如tbreak
命令。
请注意,GDB 和 GCC 都是 free software,您可以下载它们的源代码并研究然后改进它们的代码。
还可以从现有开源项目的源代码中获取灵感,例如 FLTK、RefPerSys、ninja....
GDB 可以是 extended,GCC 可以是 extended,以及您的插件。
另请参阅 DECODER 项目(以及 GCC 之上的 Bismon 静态源代码分析器)和 Frama-C 静态分析器。如果有兴趣,请通过电子邮件与我联系 <basile.starynkevitch@cea.fr>
另见 this C++ reference 和一些 C++ 标准,如 n3337 或更好。
考虑使用 Clang static analyzer(您可以研究其源代码,因为它是开源的)。
注意 C++ rule of five。