0

任何人都可以帮助我吗?我有我的文件:

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 并使用调试器模式向我展示:

  1. 错误出现在主要的 tec 函数中。
  2. 错误在 .cpp 文件中,在构造函数复制定义中。

但是,如果我删除 main 的 tec 功能,我不会收到任何错误。

4

1 回答 1

2

您的直接问题是您的默认构造函数初始化cadNULL

cadena::cadena():cad(NULL),valor(128){}

但是您的复制构造函数将其参数传递cadstrlen

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而不是显式管理此内存。这将消除这个问题和其他几个问题。

于 2013-06-09T05:27:04.723 回答