程序在release下没问题,debug下崩溃了
#include <iostream>
using namespace std;
#include <string>
#include "print.h"
#include <typeinfo>
typedef unsigned int Uint;
class Array
{
Uint n;
pair<string, string>* p;
public:
Array():n(1){p = new pair<string,string>[n];}
Array(Uint n):n(n){p = new pair<string, string>[n];}
Array(const Array& a):p(new pair<string, string>[n]),n(a.n){
memcpy(p, a.p, a.n*sizeof(pair<string,string>));
}
Array& operator=(const Array& a){
if(this==&a)return *this;
delete [] p;
p = new pair<string,string>[a.n];
n = a.n;
memcpy(p, a.p, a.n*sizeof(pair<string,string>));
}
~Array(){delete [] p;}
pair<string, string>& operator[](Uint i)const{if(i>=n)throw 0;return p[i];}
string& operator[](string key)const{
for(Uint i = 0; i < n; i++){
if(p[i].first == key)return p[i].second;
}
for(Uint i = 0; i < n; i++){
if(p[i].first.empty())
{
p[i].first = key;
return p[i].second;
}
}
throw "没有该键对应的值也无法再增加了!!";
}
};
int main()
{
Array user(4);
user["id"] = "a001";
user["name"] = "zhangsan";
user["pwd"] = "111111";
user["email"] = "z@163.com";
//下面这行注释掉没问题,但打开注释就程序崩了。
//插断点调试发现在第二次执行析构函数时,delete [] p时候出问题了
//但不知道为什么,gcc下和vs2010的release下都没问题,debug就不行
Array test = user;
return 0;
}
[解决办法]
memcpy(p, a.p, a.n*sizeof(pair<string,string>));
pair里面放的是string,不能这样拷贝,你这样拷贝到的是string里面管理字符串的指针,而不是字符串本身
老老实实循环吧
------解决方案--------------------
Array(const Array& a):p(new pair<string, string>[n]),n(a.n){
memcpy(p, a.p, a.n*sizeof(pair<string,string>));
}
new p的时候n可能还没有赋值,最好用a.n
[解决办法]
不要对容器使用memcpy,改用std::copy