我是C ++的新手,我刚开始使用名为classes的容器。
我正在开发一个定义了一个对象的程序,并存储在一个向量中。
程序如下,然后是我得到的错误的描述。
这是“car.h”
#ifndef CAR_H_GUARD
#define CAR_H_GUARD
class car{
int v;//the velocity
int loc;//location
public:
//default constructor, copy constr., cp. assgnmt. optr., destructor
car();
car(const car& j);
car& operator=(const car& j);
~car();
void set_v(int); //sets velocity
void set_pos(int); //sets position
int get_v (){return((v));}//returns velocity
int get_pos(){return(loc);}//returns position
};
#endif
这是“car.cpp”
#include "car.h"
#include <iostream>
using namespace std;
//constructor
car::car() {
v=1;
loc=0;
}
//copy constructor
car::car(const car& j){
v=j.v;
loc=j.loc;
}
//copy assignment operator
car& car::operator=(const car& j){
v=j.v;
loc=j.loc;
return *this;
}
//destructor
car::~car () {
delete &v;
delete &loc;
}
//sets velocity
void car::set_v(int p){
v = p;
}
//sets position
void car::set_pos(int l){
loc = l;
}
我试图通过拥有一个复制赋值运算符来创建“移动构造函数”。这是针对以下代码,涉及我的对象的向量。
#include "main.h"
#include "car.h"
#include <iostream>
#include <vector>
using namespace std;
//update car position
void update (vector <car> &cr){
//changes state of cars, eg.
for (int c = 0; c<cr.size();c++){
cr[c].set_v(1);
cr[c].set_pos(100);
}
}
int main(){
//a vector of cars
vector<car> cat;
car j;
j.set_v(100);
j.set_pos(99);
cat.push_back(j);
//new cars enters the road
j.set_v(120);
j.set_pos(77);
cat.push_back(j);
j.set_v(80);
j.set_pos(55);
cat.push_back(j);
//updating cars
update(cat);
//output
for (int i = 0; i<cat.size(); i++){
cout << cat[i].get_v()<<" is the velocity of car "<<i<<".\n";
cout << cat[i].get_pos()<<" is the position of car "<<i<<".\n";
}
}
我收到以下错误,我在Internet上查了一下。
main(8852)malloc:* * *对象0x7fff5fbff630的错误:未释放指针被释放 * * *在malloc_error_break中设置断点以进行调试 中止陷阱
虽然它可能是一个编译器不兼容(我在Xcode中编写...并使用g ++,在mac 10.6.8 ...),但是当向量中只有一个汽车时,代码确实给出了输出。当我试图介绍其他车时,我只收到malloc错误。我想知道我是否遗漏了类定义的东西,或者某种程度上我搞砸了数据类型或指针引用。如果我试图用更新函数非常简单地操作它,那么输出的值也会出现问题。
我甚至试图将一个指针向量(到类)传递给更新函数;我仍然无法在向量中插入新元素。这个网站非常有助于我学习类结构及其指针。
感谢您阅读这个长期问题。
答案 0 :(得分:2)
仅在使用delete
的内容上使用new
。您从不 delete
未由new
单独分配的内容。你Car
析构函数中的这些行是......非常具有破坏性(原谅我的双关语):
delete &v;
delete &loc;
删除这些行 - 它们完全没必要,它们是您问题的根源。几乎是你在析构函数中使用delete
的唯一一次是当你使用new
在构造函数中分配一个对象时 - 或者当一个指向对象的指针传递给你的构造函数时理解为你的对象负责在你的对象被破坏时删除指针。