关于new分配内存而无法delete的问题

phb711 2008-04-05 11:14:09
请各位帮忙解答下,这个问题遇到几次了,郁闷
当在函数中调用:
double * SwatchData = new double;
时,若是在程序中调用SwatchData[i]之类的,后面使用
delete SwatchData;时就有错,会出现内存的问题。

下面是一个非常典型的例子,在VC6.0下面调试会报错
#include <iostream>

using namespace std;
int main()
{
int *temp = new int;

for (int i =0; i<10 ;++i)
{
temp[i] = i;
}
delete temp;

return 0;
}
很明显,在delete之前temp里面的数据是写进去了的
但是为什么delete就有错呢
我知道,如果指定temp大小的是没有错的,但是有些情况下运行前是不知道其大小的,如果调用两次for循环的话感觉效率较低(尤其是for循环较大的时候)
...全文
828 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyfly34 2008-04-09
  • 打赏
  • 举报
回复
用vector,如果长度不够,还可以增加!
con_con 2008-04-09
  • 打赏
  • 举报
回复
越界为什么不是在赋值的时候报错???????????????????????????????????????????????????????????????????????????????
Torch009 2008-04-09
  • 打赏
  • 举报
回复
星羽终于出山了
Juigo 2008-04-08
  • 打赏
  • 举报
回复
越界了,少个for语句还差不多。
forceruler 2008-04-08
  • 打赏
  • 举报
回复
vector对内置类型是很好,但是如果要Push_back自定义类型时需要注意你的构造函数,拷贝构造函数等是否定义恰当
two_ears 2008-04-08
  • 打赏
  • 举报
回复
vector是好,不过,就好像primer4提倡的观念,C的风格要废弃了?不知道是不是好事。
two_ears 2008-04-08
  • 打赏
  • 举报
回复
老大呀,您越界了
zjh2702 2008-04-08
  • 打赏
  • 举报
回复
还是用vector吧
lukeamon 2008-04-08
  • 打赏
  • 举报
回复
15楼正解,自动增长。
也可以用realloc();
lily604 2008-04-07
  • 打赏
  • 举报
回复
呵呵没关系的,我碰巧知道一点东西就告诉你了
phb711 2008-04-06
  • 打赏
  • 举报
回复
不好意思
15楼的大哥,我看问题大概解决就结帖了
大哥所给意见很好,但是我很懒,还是用vector去吧
lily604 2008-04-06
  • 打赏
  • 举报
回复
引用5楼dizuo
#include <iostream>

using namespace std;
int main()
{
int *temp = new int[10];

for (int i =0; i <10 ;++i)
{
temp[i] = i;
}
delete temp;

return 0;
}
.............................delete忘了加[]了

楼主可以自己定义一个类,可以调用自己成员函数增长大小那种,比如用isfull()判断,如果full了,就再重新分配大一点的空间,别忘了把原有空间回收

class stack
{
public:
bool isfull()
{
if(top==capacity)
return 1;
}
void grow()
{
if(isfull())
int *arrnew=new int[2 *capacity];
for( int i=0;i<capacity;i++)
arrnew[i]=arr[i];
capacity=2*capacity;
delete []arr;
arr=arrnew;
}
private:
int * array;
int top;
int capacity;
};
lin_style 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 phb711 的回复:]
若是指定vector的长度,那和
new double[10];又有什么区别呢
看来只能如8楼所说,事先获取其长度才能分配内存了
[/Quote]

动态的增长不也是人做的事吗?
手动加个函数管理下,比如如果用到当前80%的空间,重新申请个2倍的,然后继续之。。。
phb711 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Chiyer 的回复:]
C/C++ code#include<iostream>#include<vector>usingnamespacestd;intmain()
{

vector<int>buf;for(inti=0; i<10;++i)
{
buf.push_back(i);
}for(i=0; i<buf.size() ;++i)
{
cout<<buf[i]<<endl;
}return0;
}
[/Quote]
对了
居然把pushback忘了,汗一个!
多谢大哥指教
phb711 2008-04-06
  • 打赏
  • 举报
回复
若是指定vector的长度,那和
new double[10];又有什么区别呢
看来只能如8楼所说,事先获取其长度才能分配内存了
星羽 2008-04-06
  • 打赏
  • 举报
回复

#include <iostream>
#include <vector>

using namespace std;
int main()
{

vector <int> buf;

for (int i =0; i <10 ;++i)
{
buf.push_back(i);
}

for (i=0 ; i < buf.size() ;++i)
{
cout << buf[i] <<endl;
}

return 0;
}

phb711 2008-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dizuo 的回复:]
int *temp = new int;  只是申请了可以存储一个int的空间;
c++里面用new无法分配动态增长的空间,你可以使用STL中的:vector
[/Quote]
很明显这样也会有错
#include <iostream>
#include <vector>

using namespace std;
int main()
{

vector<int> buf;

for (int i =0; i<10 ;++i)
{
buf.at(i) = i;
}

for (i=0 ; i<10 ;++i)
{
cout<< buf[i] <<endl;
}

return 0;
}
EricFengJia 2008-04-06
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;
int main()
{
int *temp = new int[10];

for (int i =0; i <10 ;++i)
{
temp[i] = i;
}
delete []temp;

return 0;
}
星羽 2008-04-05
  • 打赏
  • 举报
回复

1)
请各位帮忙解答下,这个问题遇到几次了,郁闷
当在函数中调用:
double * SwatchData = new double;
时,若是在程序中调用SwatchData[i]之类的,后面使用
delete SwatchData;时就有错,会出现内存的问题。

---------

越界,double * SwatchData = new double; 后
SwatchData[i] 如果i 〉0,那么你就写越界了,写到你不该写的地方去了
当delete的时候会做检查的,所以报错



2)
下面是一个非常典型的例子,在VC6.0下面调试会报错
#include <iostream>

using namespace std;
int main()
{
int *temp = new int;

for (int i =0; i <10 ;++i)
{
temp[i] = i;
}
delete temp;

return 0;
}

--------

出错原因如上面所说,你应该改为

下面是一个非常典型的例子,在VC6.0下面调试会报错
#include <iostream>

using namespace std;
int main()
{
int *temp = new int[10];

for (int i =0; i <10 ;++i)
{
temp[i] = i;
}
delete[] temp;

return 0;
}


3)
我后面的问题大哥们还没回答呢
那岂不是我无法分配一个动态增长的内存?
比如说我想从一个文件中读取数据存到一个数组中,那我岂不要先遍历一下,获取行数然后才能分配内存?
如果这样的话,那
int *temp = new int;
要它何用?

-------------------

应该情况是的,你先要想办法求得数据的大小,在new []

或则使用c++的容器,比如vector, list 等等


ryfdizuo 2008-04-05
  • 打赏
  • 举报
回复
int *temp = new int; 只是申请了可以存储一个int的空间;
c++里面用new无法分配动态增长的空间,你可以使用STL中的:vector
加载更多回复(6)

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧