首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟我写的一个小函数,如何感觉不太对

2012-04-20 
我写的一个小函数,怎么感觉不太对,C/C++ codeTCHAR* Ansi2Unicode(char* szMultiByte){int nLen MultiBy

我写的一个小函数,怎么感觉不太对,

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的家伙必须负责在合适的时候释放它所申请的空间。否则会导致内存泄露。
[解决办法]
一般情况下要遵循“谁申请谁释放”的原则。
[解决办法]
探讨
我有点明白了 就是说还是要释放的 要不一直占用内存 是这样的吗?

还有 就是下次调用 就是你说的 重新申请一个szWideChar吗?跟上次申请的没关系??

那我要时候用malloc 每次申请的空间也是和上次调用申请的 也没关系是吧 只要把每次申请的空间及时删除 就行

我理解的对吗?

[解决办法]
探讨
引用:
一般情况下要遵循“谁申请谁释放”的原则。


每次都能看到你 呵呵

在哪个地方 释放 好呢 函数返回结果后 还是前面
我看别人写的 都是在 return 前面删除的 那样的话 return 返回的还正确吗 不是都删除了吗 里面还保存转换的字符串吗?

[解决办法]
一般情况下要遵循“谁申请谁释放”的原则。 


但很多情况,根据需要 是需要在使用的地方释放堆内存 而不是在申请的地方释放..
如果 比较工程比较复杂 或是为了规则性 可以定义个释放接口...
其实最简单的 就是在你用完的地方 释放就好..
这种情况在项目中是不得已 出现的 很常见
[解决办法]
......都反复说几次了:普通局部变量只在一次调用里有效,下一次对同一个函数的调用里你使用的是完全不同的另外两个变量。它们和上一次的两个变量之间没有半点关系了。

就像现在也有人名叫李白,但他和诗仙没有半点关系。
[解决办法]
探讨

一般情况下要遵循“谁申请谁释放”的原则。

[解决办法]
探讨
引用:

一般情况下要遵循“谁申请谁释放”的原则。
你看这个
typedef struct Node {
int data;
struct Node *next;这一行如何解释?这个 next指针 指哪了呢?//指向下一个节点啊
}Node,Linklist;

[解决办法]
探讨
别人写的

wstring StringToWstring(string strInput)
{
wstring wstr;
int len = strInput.length();
wchar_t *pwstr = new wchar_t[len + 1];
mbstowcs(pwstr, strInput.c_str(), len);
delete[] p……

[解决办法]
如果你想要把申请内存中的内容传递给函数外的使用者,你就不能再函数内将该内存释放回去。

如果你不需要将该内存的内容传递出去,那就应该在函数内将该内存释放。
[解决办法]
如果不是在循环中,直接用这几个宏转换吧:A2T, T2A, W2T, T2W, A2W, W2A.

热点排行