我已经看到了对C ++中STL字符串的复制构造函数行为的各种冲突引用,我希望有人可以为我澄清这一点,给出以下代码段:

string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();

对象''是否构成函数'str()'中定义的字符串对象的深层副本? 或者是对象''简单地指向在'str()'函数中的字符串构造函数调用期间分配的同一块内存?

===============>>#1 票数:5 已采纳

字符串将深层复制,它们不共享相同的缓冲区。

也就是说当从函数返回它们时,大多数优秀的编译器可以使用返回值优化或复制省略,这样操作就不那么昂贵(甚至免费)。

如果你使用的是c ++ 11,那么移动语义是由标准指定的,所以对于像返回字符串这样的东西,请确保最坏的情况(即使没有优化)相当便宜。

编辑:总结一下,您可以保证您“拥有”的字符串将具有唯一的内存块,该内存块将至少持续至少本地字符串的生命周期。 但是,编译器很可能不会从函数中的字符串中复制它,而只是交换它的指针,甚至完全省略了副本(意味着函数中的字符串实际上也是你指定的字符串)。

===============>>#2 票数:1

是的,它执行逻辑深层复制。

N3126,21.4.2 ,表61:

data() - 指向数组的已分配副本的第一个元素,其第一个元素由str.data()指向

  ask by Gearoid Murphy translate from so

未解决问题?本站智能推荐:

1回复

字符串类构造函数和复制构造函数

我正在构建一个String类,并且想知道在构造函数和复制构造函数中是否应该复制字符或仅指向与传递的String对象的char * / char *相同的内存地址? 这是我到目前为止写的: 在构造函数中,我只是指向与const char *相同的地址,应该保留该地址还是将每个字符复制到新
1回复

在字符串的复制构造函数上出现段错误

我在用复制构造函数创建c ++字符串的一行上遇到了段错误。 我已经看过一些类似的问题,但是它们都是由于传入了错误的c ++字符串对象引起的。 我只是传递一个原始字符串,所以我不确定我的问题是什么。 我将粘贴相关的代码片段(它是从几个不同的文件中提取的,因此看起来有些混乱)。 段错误发生在
2回复

为字符串类创建复制构造函数

我正在制作自己的字符串类(作为练习),我知道我需要一个复制构造函数和一个重载的=赋值运算符,但不确定从哪里开始。 该类很简单,仅存储字符串,例如 我目前有一个标准的构造函数( MyString(const char* str) ),它接受const char* string ,然后
4回复

复制构造函数中的内存泄漏

我已经尝试阅读许多解决方案,以防止复制构造函数中发生内存泄漏,但是我仍然没有理解如何解决它。 例如,我有一个“ Person”类,该类具有这些成员和函数(头文件): 在此程序中,我试图将“对象”输入到Vector中,而Person和Vector则继承自Object。 在两个副本c
1回复

复制字符串集的正确方法是什么(在复制构造函数和赋值运算符中)?

代码块A: 代码块B: 在代码块A和B中,字符串集的复制是不同的。 哪个是复制字符串集的正确方法? 为什么? 如果复制是在复制构造函数/赋值运算符中进行的,是否有所不同? 如果是这样,为什么?
5回复

C ++:从复制构造函数外部修改对象成员时的向量内存损坏,但在从内部修改时则不会

我不明白从外部和CC内部调用它之间的区别。 我也不知道为什么它在任何情况下都会引起问题。
1回复

将向量类重新实现为动态数组:复制构造函数导致内存故障[重复]

这个问题已经在这里有了答案: 什么是三法则? 8个答案 对于编程讲座,我试图在自己的向量类中重新实现一些C ++标准向量类的功能。 我现在看了几个类似的类和实现,并且我的实现(除了使用初始化列表之外)完全相同,并且到目前为止,大多数功能都按预期工作。 我故意使
2回复

复制构造函数应复制* string值

我有一堂课: 我想我的复制构造函数将字符串(不是指针,而是指针指向的字符串)复制到新对象。 我尝试了两种不同的方法,但从未成功。 编译器消息: conversion from 'std::string* {aka std::basic_string<char>
1回复

使用.Copy执行复制构造函数的最佳方法?

我需要在我的面向对象程序中执行此副本构造函数的帮助。 结果应该是将字符串1: Hello World复制到字符串2: This is a test 。 在我的.h文件中 : 在我的.cpp文件中 : 在我的main.cpp文件中 : 输出 : 应该是 :
1回复

复制构造函数更改std :: string

有人可以告诉我这里发生了什么吗? (我对C ++不够熟悉)。 我有一个std::string ,它以4 int32_t开头,方法是使用二进制stringstream并调用方法write() 。 当我这样做时, index , type和tag (4个int32-ts中的3个)是正确