首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++对象复制

C++对象复制
EN

Stack Overflow用户
提问于 2020-08-29 16:02:55
回答 3查看 70关注 0票数 1

我只是看看下面的代码片段:

代码语言:javascript
复制
#include<iostream>
#include<cstring>
using namespace std;

class String
{
private:
    char *s;
    int size;
public:
    String(const char *str = NULL); // constructor
    ~String() { delete [] s; }// destructor
    void print() { cout << s << endl; }
    void change(const char *); // Function to change
};

String::String(const char *str)
{
    size = strlen(str);
    s = new char[size+1];
    strcpy(s, str);
}

void String::change(const char *str)
{
    delete [] s;
    size = strlen(str);
    s = s + 1;
    s = new char[size+1];
    strcpy(s, str);
}

int main()
{
    String str1("StackOverFlow");
    String str2 = str1;

    str1.print();
    str2.print();

    str2.change("StackOverFlowChanged");

    str1.print();
    str2.print();
    return 0;
}

我期望输出为: StackOverflow,StackOverflowChanged。

str2.change("StackOverFlowChanged")行之前,str1和str2的都指向相同的内存位置。但是,在change方法中,由于指针值发生了变化,除了现在的str1和str2的指向不同的位置之外,情况并非如此。有人能解释一下为什么会这样吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-29 16:08:21

调用str2.change后,str1不再具有有效的指针。由于两个对象共享同一个指针,通过删除一个对象中的数组,另一个对象现在指向已删除的数组。试图访问str1指向的数组是未定义的行为,因此str1.print()是无效代码。

现在,在这种特殊情况下,new char[]str2.change中恰好返回指向与刚刚删除的地址相同的地址的概率是很好的。毕竟,内存刚刚被释放,同时没有进行任何其他分配。因此,当str1的指针仍然无效时,它恰好在调用str1.print时指向一个有效的字符串。

但这只是偶然事件;实现不一定要这样做。未定义的行为是未定义的,您需要properly follow the Rule of 5。或者只使用std::string

票数 1
EN

Stack Overflow用户

发布于 2020-08-29 16:08:00

问题是,您在str1指出的内存中调用了str1

然后允许运行时库为下一个分配调用重用相同的内存,显然这就是所发生的情况。

str1没有改变它所指向的内存,但是内容发生了变化。

注意,在delete[]d之后使用指向内存的指针是未定义的行为。因此,任何事情都可能发生。

在编写拥有堆分配内存的类时,应该非常小心谁拥有内存,以及何时释放该内存;特别是,应该注意复制构造函数和赋值操作符,因为在使用原始指针拥有内存的情况下,自动生成的代码很少是正确的。

票数 0
EN

Stack Overflow用户

发布于 2020-08-29 16:14:32

不,str1和str2在str2.change("StackOverFlowChanged")行之前没有指向相同的内存位置。str2位于不同的位置,但其值与str1相同。你可以用-

代码语言:javascript
复制
cout << &str1 << '\t' << &str2 << endl;

它将显示它们在内存中有不同的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63649053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档