2 rangzidanfeiba rangzidanfeiba 于 2017.01.12 21:05 提问

c++指针赋值后地址错误 3C

下面是gdb调试结果, 注意看p &copyConfig->roleDefine 显示地址是 0x3116030,赋值给引用后(const RoleDefineVector *) 0x311602c,赋值前后值竟然变化了, 这是怎么回事呢?求大侠指教

296 if ( !copyConfig) {
(gdb) p copyConfig
$1 = (CopyConfigBase ) 0x3115fe8
(gdb) p &copyConfig->roleDefine
$3 = (RoleDefineVector *) 0x3116030
(gdb) n
299 Map
scene = MapManager::getInstance().loadMap(copyConfig->mapid);
(gdb) n
300 if ( !scene ) {
(gdb) p scene
$4 = (Scene ) 0x7ffeb406b848
(gdb) n
303 const RoleDefineVector& ndv = copyConfig->roleDefine;
(gdb)
305 HangCopy
copy= new HangCopy( copyConfig, scene);
(gdb) p ndv
$5 = std::vector of length 38654705664, capacity 68719476736 = {Cannot access memory at address 0x311748000000000
(gdb) p &ndv
$6 = (const RoleDefineVector *) 0x311602c
(gdb) dis

4个回答

caozhy
caozhy   Ds   Rxr 2017.01.13 00:00

看下是不是访问别的变量引起数组越界了。

a29562268
a29562268   2017.01.13 08:17

const变量储存的空间与普通变量不是同一块空间

justin_bkdrong
justin_bkdrong   2017.01.15 18:40

const RoleDefineVector& ndv = copyConfig->roleDefine;
分配后,在栈内会创建一个指针变量 ndv ,这个里面的值就是 copyConfig->roleDefine 的地址
前后的值变化,说明这个ndv指针存储的值变化了,你把ndv地址找到,然后设置一个断点(当此数据被修改则触发断点)。那么就会查找到是谁修改的这个值。

shen_wei
shen_wei   Ds   Rxr 2017.01.17 15:17

还是上代码更合适看出来问题。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!