任何人都能帮帮我吗?我有我的档案:
prueba.h
#ifndef PRUEBA_H
#define PRUEBA_H
#include <iostream>
#include <cstring>
using namespace std;
class cadena{
public:
cadena();
cadena(const char *c);
cadena(int n);
cadena(const cadena &Cad);
~cadena();
void DevDir();
void Asignar(const char *dest);
char *Leer(char *c);
private:
char *cad;
short valor;
friend void tec(cadena obj);
};
#endif
prueba.cpp
#include "prueba.h"
cadena::cadena():cad(NULL),valor(128){}
cadena::cadena(const char *c){
cad = new char[strlen(c)+1];
strcpy(cad,c);
}
cadena::cadena(int n){
cad = new char[n+1];
cad[0] = 0;
}
cadena::cadena(const cadena &Cad){
cad = new char[strlen(Cad.cad)+1];
strcpy(cad,Cad.cad);
}
cadena::~cadena(){
delete[] cad;
}
void cadena::DevDir(){
cout << "dir valor: " << &cad << endl;
}
void cadena::Asignar(const char *dest){
delete[] cad;
cad = new char[strlen(dest)+1];
strcpy(cad,dest);
}
char *cadena::Leer(char *c){
strcpy(c,cad);
return c;
}
void tec(cadena obj){
cout << obj.valor << endl;
}
和我的文件主要:
#include "prueba.h"
int main(){
cadena Cadena1;
tec(Cadena1);
cin.get();
return 0;
}
问题是我的朋友功能(tec)。编译没问题,但是在运行时它会向我显示一个错误,就像内存访问冲突一样。
如果我删除main的这个功能,一切正常。
我使用Code :: blocks并使用debbuger模式向我显示:
但是如果我删除main的tec功能,我就没有错误。
答案 0 :(得分:2)
您当前的问题是您的默认构造函数会将cad
初始化为NULL
:
cadena::cadena():cad(NULL),valor(128){}
但你的拷贝构造函数将其参数cad
传递给strlen
:
cadena::cadena(const cadena &Cad){
cad = new char[strlen(Cad.cad)+1];
strcpy(cad,Cad.cad);
}
这是NULL
时的非法行为。
在这种情况下,最简单的修复可能是明确检查NULL
:
cadena::cadena(const cadena &Cad){
if(Cad.cad == NULL) {
cad = NULL;
} else {
cad = new char[strlen(Cad.cad)+1];
strcpy(cad,Cad.cad);
}
}
但使用std::string
而不是显式管理此内存会好得多。这将消除这个问题和其他几个问题。