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下运行正常

新手还请各位讲解下。
...全文
166 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
无涯回头 2017-06-21
  • 打赏
  • 举报
回复
万分感谢,眼瞎没看见。
sdghchj 2017-06-21
  • 打赏
  • 举报
回复
_elem = new Rank(_capacity *=2); -> _elem = new Rank[_capacity *=2];

65,187

社区成员

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

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