写一个小软件,中间涉及到了将 CString 转换为 TCHAR*
在网上搜到了函数 CString 的函数 GetBuffer()
然后用ReleaseBuffer释放缓冲区
这是我的部分代码
UINT nSelNum = m_lcShow.GetNextItem(-1, LVNI_SELECTED);
CString szProxyAdd = m_lcShow.GetItemText(nSelNum, 0),
szProxyPort = m_lcShow.GetItemText(nSelNum, 1);
TCHAR* pszProxyAdd = new TCHAR[19];
TCHAR* pszProxyPort = new TCHAR[19];
pszProxyAdd = szProxyAdd.GetBuffer(szProxyAdd.GetLength());
pszProxyPort = szProxyPort.GetBuffer(szProxyPort.GetLength());
m_iepProxy1.SetIEProxy(pszProxyAdd, pszProxyPort);
szProxyAdd.ReleaseBuffer();
szProxyPort.ReleaseBuffer();
pszProxyAdd = NULL;
pszProxyPort = NULL;
之前写的时候在
pszProxyAdd = NULL;
pszProxyPort = NULL;
之前有
delete[] pszProxyAdd;
delete[] pszProxyPort;
结果函数一执行完,程序就报堆错误
本来以为是 SetIEProxy() 函数的错误,设断点调了半天都没找到错误
函数还重写了一遍,搞了近半个小时
毫无结果,后来灵感突来,google了一下 ReleaseBuffer 作用
找到了这个帖子
http://topic.csdn.net/t/20030324/21/1571461.html
顺藤到了msdn上
搜索了一下结果得到了如下代码段
{
// ...
enum {
bufferSize = 1024
};
CSimpleString s( "abc", pMgr );
LPTSTR p = s.GetBuffer(bufferSize);
strcpy_s( p, bufferSize , "abc" ); // use the buffer directly
_ASSERT( s.GetLength( ) == 3 ); // String length = 3
s.ReleaseBuffer( ); // Surplus memory released, p is now invalid.
_ASSERT( s.GetLength( ) == 3 ); // Length still 3
}
才发现错误,真TMD,哪有人这样写函数的,小小BS一下MS
不过只是想想也有点道理,内存都被delete了,指向它的指针确实没意义了