dll 中fun1(char *pStr1[])
{
for(int i=0;...)
{
pStr1[i]=new char[10];
pStr1[i]="test";
}
}调用函数fun2()
{
char *pStr2[30]={NULL};
fun1(pStr2);
//下面这么操作会出错
//for (int j=0;..)
//{
// delete []pStr2[j]
//}
}我怎么才能删除fun1里的指针数组呢?
{
for(int i=0;...)
{
pStr1[i]=new char[10];
pStr1[i]="test";
}
}调用函数fun2()
{
char *pStr2[30]={NULL};
fun1(pStr2);
//下面这么操作会出错
//for (int j=0;..)
//{
// delete []pStr2[j]
//}
}我怎么才能删除fun1里的指针数组呢?
解决方案 »
- CScrollView类中,移动滚动条,视图中无任何变化!
- MFC 菜鳥首發 幫我看看。
- 老是提示'm_pConnection' ,'m_pRecordset' : undeclared identifier
- 消息框和窗体显示顺序
- 函数和后面的()括号之间是不是一定要加空格?
- 在MDI窗体中显示对话框,如何确定对话框的显示位置??
- 源码下载FTP大量更新,提供众多免费下载
- 关于Streambox vcr!!!!
- 求助!如何在文本中判断----回车换行? 多谢
- WNETADDCONNECTION2,和 WENTCANCELCONNECTION2可以用来断开和重连局域网吗?
- IOCP的疑问
- 如何实现按钮打开另一个对话框?
{
for(int i=0;...)
{
pStr1[i]=new char[10];
pStr1[i]="test";
}
}
===
你这段代码本来就有大毛病。肯定会泄漏啊。pStr1[i] = new char[10],这句话给pStr1[i]指定了一个地址,接着你又pStr1[i]='test',这又将pStr1[i]指向另一个地址,这样new的地址就没有人知道了。到外面自然不能删除。
fun1(char *pStr1[])
{
for(int i=0;...)
{
pStr1[i]=new char[10];
strcpy(pStr1[i],"test");
}
}
2. 最好暴露一个内存清理函数
再一次牢记一下!
pStr1[i]=new char[10];
strncpy(pStr1[i],"test");
这个变量不是全局的,我怎么能再去写一个清除的函数呢?
不明白
pStr1[i]="test"; //相当于把"test"的指针赋予了pStr1[i],所以你删除这个静态指针就出错了改成strcpy(pStr1[i],"test"); 就只是拷贝字符串的内容,pStr1[i]还是你刚才new的那个指针,所以没问题
fun1(char *pStr1[])
{
for(int i=0;...)
{
pStr1[i]=new char[10];
strncpy(pStr1[i],"test",strlen("test"));
}
}
{
for(int i=0;...)
{
pStr1[i]=new char[10];
strncpy(pStr1[i],"test",strlen("test"));
}
}
调用函数中
fun2()
{
char *pStr2[30]={NULL};
fun1(pStr2);
//下面这么操作会出错
//for (int j=0;..)
//{
// delete []pStr2[j]
//}
}
2。你的程序显然不是你的原程序,是你简写的代码,可能你的简写把问题精简掉了。
3。你说的错误是何种错误?调试结果如何?delete是,数组的数据内容是否有效?
4。从大的范围来说,你必须在动态库中进行new么?
或者dll提供一个释放的接口,在dll中释放内存。
又重新分配了内存,最后指针又传到 fun1(pStr2);函数里。内存泄露
解决办法
1:使用相同的库(比如都动态链接MFC/CRT/ALT),或者按MSDN里面的要求作相应选择。
2:使用malloc,free(大家别拍我砖啊,我平时也不用它们的);
3:使用native api.
{
for(int i=0; i < 30; ++i)
{
pStr1[i]=new char[10];
}
}int main()
{ char *pStr2[30]={0};
fun1(pStr2);
//下面这么操作会出错
for (int j=0; j < 30; j++)
{
delete[] pStr2[j];
}
return 0;
}没有问题。
{
for(int i=0;...)
{
pStr1[i]=new char[10];
sprintf_s(pStr1[i], 10, "test");
}
}
fun2()
{
char *pStr2[30]={NULL};
fun1(pStr2);
for (int _i = 0; _i < 30; ++_i)
delete []pStr2[_i];
}