被坑到吐血,vector 元素地址会变!

被坑到吐血,vector 元素地址会变!

在我的程序中,我用到一个Combo-Box控件,控件里的数据是在动态插入的。为了在程序中可以访问到Combo-Box控件选中项目对应的数据,我给对话框设置了一个成员变量vector <string> m_str;用于保存所有待选条目对应的数据。


(图源 :pixabay)

故障

在添加数据的代码代码段中,我用如下代码段(1)添加:

然后在程序其它部分需要读取的时候,我使用类似如下代码读回数据:

结果这程序行为时而正常,时而崩溃,我意识到我的程序可能哪里有问题,但是会是哪里的问题呢?

原因

因为崩溃时都是内存读写错误,出在这个语句上:str = *(string *)m_pComboBox->GetItemDataPtr(index);所以我想到可能是我写入的数据不对,导致读出不正常。

于是我将代码段(1)修改成这个样子,就是写入之后马上读回校验一下:

事实证明在此处写入和读出的数据没有一点问题。

那么问题会出在哪里呢?我想来想去,想到一种可能,我的程序不同部分之间传递的是vertor元素的地址,如果元素的地址变化了呢?但是元素的地址会变化吗?于是我写了一个程序验证一下这个问题。

上述代码输出如下:

也就是说,除了最后添加的元素,其它元素地址均发生了变化,这也解释了为何我的程序有时候好用有时候崩溃(选择最后的项目时,因为地址没变,所以可以读出数据)

解决

知道了这个问题的原因所在,解决起来就好办多啦。我可以将上述代码修改为这个样子:

当然了,其实我还可以直接用序号,不用来回传递指针。

结论

看似很简单的问题,却又浪费我小半天时间。看来基本功不扎实就是要反复做无用功呀。


This page is synchronized from the post: 被坑到吐血,vector 元素地址会变!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×