我写的一个小函数,怎么感觉不太对,
- C/C++ code
TCHAR* Ansi2Unicode(char* szMultiByte) { int nLen = MultiByteToWideChar(CP_ACP,NULL,szMultiByte,-1,NULL,0); TCHAR* szWideChar = new TCHAR[nLen]; //Unicode宽字节编码字符串szWideChar MultiByteToWideChar(CP_ACP,NULL,szMultiByte,-1,szWideChar,nLen); //开始转换 //这个szWideChar 用不用删除啊 如果删除 是在此处。还能返回转换的字符串吗? //如果不删除 那我下次重复调用时候 参数szMultiByte 如果变长很多 或者短了 szWideChar空间也会随之变小吗 就是会不会被下次的所覆盖 return szWideChar; //还是写在最后删除 } 要时候用 malloc 需要free 去释放吗
[解决办法]
一般来说,不要返回堆指针。
如果万不得已的情况下,需要 提供一个 释放的接口。
再不济,文档中写好释放的方式
[解决办法]
在哪用完,在哪释放。
比如:你有个地方调用了这个函数:
TCHAR *pt = Ansi2Unicode();
delete [] pt;
[解决办法]
作为该函数的返回值存放空间,你不能把它删除掉。否则使用这个值的家伙能不能得到正确的结果就天知道了。
你下次调用 Ansi2Unicode的时候它会再申请一个szWideChar,和这次这个没什么关系。
不过,使用Ansi2Unicode的家伙必须负责在合适的时候释放它所申请的空间。否则会导致内存泄露。
[解决办法]
一般情况下要遵循“谁申请谁释放”的原则。
[解决办法]
[解决办法]
[解决办法]
一般情况下要遵循“谁申请谁释放”的原则。
但很多情况,根据需要 是需要在使用的地方释放堆内存 而不是在申请的地方释放..
如果 比较工程比较复杂 或是为了规则性 可以定义个释放接口...
其实最简单的 就是在你用完的地方 释放就好..
这种情况在项目中是不得已 出现的 很常见
[解决办法]
......都反复说几次了:普通局部变量只在一次调用里有效,下一次对同一个函数的调用里你使用的是完全不同的另外两个变量。它们和上一次的两个变量之间没有半点关系了。
就像现在也有人名叫李白,但他和诗仙没有半点关系。
[解决办法]
[解决办法]
[解决办法]
[解决办法]
如果你想要把申请内存中的内容传递给函数外的使用者,你就不能再函数内将该内存释放回去。
如果你不需要将该内存的内容传递出去,那就应该在函数内将该内存释放。
[解决办法]
如果不是在循环中,直接用这几个宏转换吧:A2T, T2A, W2T, T2W, A2W, W2A.