我正在学习课程和OOP,所以当我遇到编程时遇到的最奇怪的错误时,我正在做一些练习程序.
所以,我有以下文件,从我的班级"pessoa"开始,位于pessoa.h:
#pragma once
#include <string>
#include <iostream>
using namespace std;
class pessoa {
public:
//constructor (nome do aluno, data de nascimento)
pessoa(string newname="asffaf", unsigned int newdate=1996): name(newname), DataN(newdate){};
void SetName(string a); //set name
void SetBornDate(unsigned int ); //nascimento
string GetName(); //get name
unsigned int GetBornDate();
virtual void Print(){}; // print
private:
string name; //nome
unsigned int DataN; //data de nascimento
};
Run Code Online (Sandbox Code Playgroud)
其函数在pessoa.cpp中定义
#include "pessoa.h"
string pessoa::GetName ()
{
return name;
}
void pessoa::SetName(string a)
{
name = a;
}
unsigned int pessoa::GetBornDate()
{
return DataN;
}
void pessoa::SetBornDate(unsigned int n)
{
DataN=n;
}
Run Code Online (Sandbox Code Playgroud)
一个函数,DoArray,在DoArray.h中声明,并在文件DoArray.cpp中定义:
pessoa** DoArray(int n)
{
pessoa* p= new pessoa[n];
pessoa** pointer= &p;
return pointer;
}
Run Code Online (Sandbox Code Playgroud)
主文件:
#include <string>
#include <iostream>
#include "pessoa.h"
#include "DoArray.h"
#include <cstdio>
using namespace std;
int main()
{
//pessoa P[10];
//cout << P[5].GetBornDate();
pessoa** a=DoArray(5);
cerr << endl << a[0][3].GetBornDate() << endl;
cerr << endl << a[0][3].GetName() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我评论上面的方法之一,"GetBornDate"或GetName,并运行,未评论的方法将运行正常和假设.但是,如果两者都没有被注释,那么第一个将运行,程序将在第二个方法之前崩溃.
对不起,很长的帖子.
让我们来看看这个函数:
int *get()
{
int i = 0;
return &i;
}
Run Code Online (Sandbox Code Playgroud)
它有什么问题?它返回指向局部变量的指针,当函数get()终止时它不再存在,即它返回悬空指针.现在你的代码:
pessoa** DoArray(int n)
{
pessoa* p= new pessoa[n];
return &p;
}
Run Code Online (Sandbox Code Playgroud)
你看到了这个问题吗?
更进一步澄清:
typedef pessoa * pessoa_ptr;
pessoa_ptr* DoArray(int n)
{
pessoa_ptr p= whatever;
return &p;
}
Run Code Online (Sandbox Code Playgroud)
你需要明白,无论你分配什么p都不会改变p自己的生命.指针与其他指针的变量相同.