新手求助~~关于vector的push_back()

xj_snoopy_tea 2010-12-15 04:17:37
我定义了如下的一个类(其他成员函数省略)
class VTMesh {
public:
//Constructor
VTMesh(){}
VTMesh(double x, double y, double z)
{
_verts[0] = x;
_verts[1] = y;
_verts[2] = z;
}
double _verts[3];
};
之后定义了一个存放类对象指针的容器 vector <VTMesh *> _vertices;
接下来我进行如下操作
VTMesh *v = &VTMesh(v_x, v_y, v_z);
_vertices.push_back(v);
当运行到push_back()时程序报错了,大神们为什么呢?
第一次求助轻拍~~
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
周成风 2010-12-16
  • 打赏
  • 举报
回复
笔误。。是在栈上面。。
周成风 2010-12-16
  • 打赏
  • 举报
回复
VTMesh *v = &VTMesh(v_x, v_y, v_z);

右边的对象应该是个临时对象,就是这句话运行完了,就析构了。所以指针变为一个无效的指针。由于是堆上面的,碰巧还可能不会出错。但千万别这么用。

其他的地没发现什么问题。
谁学逆向工程 2010-12-15
  • 打赏
  • 举报
回复
VTMesh *v = &VTMesh(v_x, v_y, v_z);
不应该用无名对象吧? 是不是应该构造一个有名对象,然后取对象的地址啊?
xj_snoopy_tea 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 tragicguy 的回复:]
你报错应该不是在pushback报错
我用你同样的代码也没有错,不过要注意的地方是需要NEW出来再传指针,否则在使用的时候会报错,你的异常估计也是这里!
[/Quote]

最后光标指在了vector库的
iterator end()
{return (_Last); }
调试的时候能看到指针已经赋值过了
xj_snoopy_tea 2010-12-15
  • 打赏
  • 举报
回复
class VTMesh {
public:
//Constructor
VTMesh(){}
VTMesh(double x, double y, double z)
{
_verts[0] = x;
_verts[1] = y;
_verts[2] = z;
}


//Functions for accessing data
double get_vert(unsigned int i) const { return _verts[i]; }
void add_vert(unsigned int vid, double value){ _verts[vid] = value; }

double _verts[3];
private:
};

class TMesh
{
public:
TMesh();
virtual ~TMesh();

//Functions for Creation
void ReadOffFile(char *filename);

//Functions for output
void OutMeshOffFile(char *filename);

//Function for accessing data
unsigned int v_count() const { return _vertices.size(); }

void add_vertex(VTMesh *v)
{
_vertices.push_back(v);
}

//Clear
void clear()
{
_vertices.clear();
_facets.clear();
}
vector <VTMesh *> _vertices;
private:
};
以上为TMesh.h文件

以下为TMesh.cpp文件
TMesh::TMesh()
{

}

TMesh::~TMesh()
{

}

void TMesh::ReadOffFile(char *filename)
{
ifstream ifile(filename);
if (!ifile)
{
return;
}
string line;
string str;
int i=0;

int v_size;
int f_size;
int color;
//off文件格式:第一行以off打头,第二行点数和面数,第三行开始是点,接着是面上的点的序号。
while(i < 2)
{
getline(ifile,line);
i++;
}
istringstream isstr(line);
isstr>>v_size>>f_size>>color;

double v_x, v_y, v_z;
for(; i < v_size+2;)
{
getline(ifile,line);
istringstream isvert(line);
isvert >> v_x >> v_y >> v_z;
VTMesh *v = new VTMesh(v_x, v_y, v_z);
add_vertex(v);
i++;
}
}

问题出在红色部分
大蓝头 2010-12-15
  • 打赏
  • 举报
回复
你报错应该不是在pushback报错
我用你同样的代码也没有错,不过要注意的地方是需要NEW出来再传指针,否则在使用的时候会报错,你的异常估计也是这里!
zzw820626 2010-12-15
  • 打赏
  • 举报
回复
代码贴全把
xj_snoopy_tea 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stonewater 的回复:]
VTMesh *v = &VTMesh(v_x, v_y, v_z);
改为
VTMesh *v = new VTMesh(v_x, v_y, v_z);
[/Quote]

还是不行啊~~我调试的时候v初始化对的,运行到push_back()的时候就会跳出来对话框
Unhandled exception in ***.exe: 0xC0000005: Access Violation
yihandrensunyong 2010-12-15
  • 打赏
  • 举报
回复
动态申请
stonewater 2010-12-15
  • 打赏
  • 举报
回复
VTMesh *v = &VTMesh(v_x, v_y, v_z);
改为
VTMesh *v = new VTMesh(v_x, v_y, v_z);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧