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下运行正常
新手还请各位讲解下。