C++ 如何在类函数中构造一个对象,执行一些操作并返回值?

标签 c++ destructor

源码1000多行,我就不翻了,我专门构造了一个我感兴趣的类似案例,关注源码:

#include <iostream>
using namespace std;

class Person
{
public:
    Person();
    Person(char*);
    ~Person();
    Person& operator=(const Person&);
    friend Person& example(const Person&);
    void print() const;
private:
    char* name;
};

Person::Person()
{
    name = new char[12];
    name = "Temp";
}

Person::~Person()
{
     delete[] name;
}

Person::Person(char* _name)
{
    name = new char[strlen(_name)+1];
    strcpy_s(name,strlen(_name)+1,_name);
}

Person& example()
{
    char* TestName = new char[11];
    TestName = "ShouldStay";
    Person B(TestName);
    return B;
}

void Person::print() const
{
    cout << name;
}

int main()
{
    example();
    return 0;
}

在这种情况下,example() 函数将返回:

  • example returned {name=0x007cad88 "îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ... } Person &

很明显,析构函数在 return 命令上被调用并删除了堆中的内存(所以我无法对指针做任何进一步的事情——它指向已经释放的内存——没有数据)。

我的问题是 - 如何避免这种行为?避免此类问题的最优雅方法是什么?

提前致谢!

最佳答案

  1. 使用string 而不是char[] 以避免不得不使用new
  2. 返回 Person 而不是 Person&,作为局部范围的类 离开作用域后被销毁。虽然这会导致 复制发生取决于编译器设置。这当然取决于提供适当的复制构造函数。
  3. 为保证避免复制,将example 的签名更改为:

    void example(Person& person)
    

    并在函数内填写输入人的字段。该 Person 的范围将绑定(bind)到调用范围(或您构造它的任何其他地方)。尽管此方法有缺点,例如您无法将结果链接在一起。

关于C++ 如何在类函数中构造一个对象,执行一些操作并返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22823925/

相关文章:

c++ - delete[] 运算符的时间复杂度

c++ - 对 POSIX 共享内存对象执行基于文件(基于 fd)的访问是否安全?

c++ - QTableView 根据值更改行颜色

c++ - C++中构造函数和析构函数的执行顺序

c++ - 析构函数调用的顺序是否有原因?

c# - 为什么接口(interface)不能有构造函数和析构函数?

c++ - Qt: QProcess调用终端+脚本

c++ - 如何找到 SQLWCHAR 的长度?

带有函数指针的 C++ vector push_back

c++ - 显式默认析构函数禁用类中的默认 move 构造函数