windows下delete []的异常求解,linux下正常

无涯回头 2017-06-21 07:13:13
#include <iostream>
#include <string>
#include <string>
#include <math.h>
#include <stdio.h>
#include <vector>
#include <malloc.h>
#include <algorithm>
using namespace std;
typedef int Rank;
#define DEFAULT_CAPACITY 10
class myvector{
private:
Rank _size;
int _capacity;
int *_elem;
//const int i;
protected:
void copyfrom(int *const A, Rank lo, Rank hi){
int c = 2*(hi - lo);
_elem = new int[_capacity = c];
for(int i = 0; i < c; ++i){
_elem[i] = A[lo + i];
}
}
void expand(){

cout << _size <<" "<<_capacity<<endl;
if(_size < _capacity) return;
cout<<_elem<<endl;
if(_capacity < DEFAULT_CAPACITY)
_capacity = DEFAULT_CAPACITY;
Rank *oldelem = _elem;
_elem = new Rank(_capacity *=2);
for(int i = 0; i < _size;++i)
_elem[i]=oldelem[i];
cout << _elem<<" "<<oldelem <<endl;
delete [] oldelem; //这里有个断点
//oldelem = NULL;
cout << "xxxxxxxxx" <<endl;

}
void shrink(){
if(_capacity < DEFAULT_CAPACITY/2) return;
if(_size *2 > _capacity)return;
Rank *oldelem = _elem;
_elem = new Rank(_capacity /=2);
for(int i = 0; i < _size;++i)
*(_elem+i)=*(oldelem+i);
delete []oldelem;
}
Rank find(Rank lo, Rank hi, Rank const& e)const{
int temp = hi;
while(temp-- > lo){
if(*(_elem+temp) == e)
return temp;
}
return hi;
}
Rank find(Rank const& e)const{
return find(0,_size,e);
}


public:
myvector(int c = DEFAULT_CAPACITY){
_elem = new int[_capacity = c];
_size = 0;
}
myvector(int *A,Rank lo,Rank hi){
copyfrom(A,lo,hi);
}
myvector(int *A,Rank n){
copyfrom(A,0,n);
}
myvector(myvector const &V,Rank lo,Rank hi){
copyfrom(V._elem,lo,hi);
}
myvector(myvector const &V){
copyfrom(V._elem,0,V._size);
}
~myvector(){
delete []_elem;
}
Rank size() const{return _size;}
bool empty() const{
return _size <= 0;
}
void push_back(Rank const &e){
expand();
cout <<_elem<<endl;
*(_elem + _size) = e;
++_size;
}
void pop_back(){
shrink();
--_size;
}
void printf()const{
cout << _size <<" "<<_capacity<<endl;
}

};
int main(){
myvector data;
cout << data.empty() << " ";
data.printf();
for(int i = 0; i < 50;++i){
data.push_back(i);
//data.printf();
}
cout << "All Right" <<endl;
return 0;
}

代码如上,自己随便写了个vector,但是扩容函数在扩容的时候,delete原数组时,Windows环境会报错如下:
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00007ffa82131b30 in ntdll!RtlpNtMakeTemporaryKey () from C:\Windows\SYSTEM32\ntdll.dll
warning: Critical error detected c0000374
linux下运行正常

新手还请各位讲解下。
...全文
150 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
无涯回头 2017-06-21
  • 打赏
  • 举报
回复
万分感谢,眼瞎没看见。
sdghchj 2017-06-21
  • 打赏
  • 举报
回复
_elem = new Rank(_capacity *=2); -> _elem = new Rank[_capacity *=2];
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

64,651

社区成员

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

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