一、问题提出
Mapx图层的重绘是通过响应MapX的用户自定义图层的绘制消息进行的,在消息响应函数中循环遍历地图上加载的图层,调用符合条件的图层的Draw函数进行绘制。使用此机制过程中,发现图层刷新时,内存增长很快,平均每秒钟增长8K左右。最终将问题定位到如下语句:
WideString ws = m_map->Layres->Item(i+1)->Name;
由于问题语句中“=”号右边返回的是一个BSTR类型值,所以先对BSTR类型做一个简单的介绍。
BSTR类型是为了跨语言平台使用而存在的一种宽字符集字符串指针,标准BSTR是一个有长度前缀和null结束符的OLECHAR数组,其定义如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0a 00 00 00 H E L L O \0
BSTR包含四个字节的长度前缀,BSTR的前4字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数,并且不包括0结束符。由于BSTR类型包含了长度前缀,所以需要通过SysAllocString函数进行内存分配,通过SysFreeString函数进行内存释放。其中SysAllocString函数返回的指针指向BSTR第一个字符,而不是BSTR的内