C ++ std :: move意外行为(当用于智能指针时移动字符串)

时间:2015-11-27 08:07:44

标签: c++ pointers c++11

当我将一个字符串文字传递给一个动态分配的unique_ptr然后存储在vector中时(使用std :: move,因为那里显然没有别的办法),当获取字符串时,我得到一个奇数返回值 - 它似乎已被切割/移动。

#include <iostream>
#include <vector>
#include <memory>

class Something {
private:
    const char* name;
public:
    Something(const char* name) {
        this->name = name;
    }

    void printDetails() {
        std::cout << this->name << std::endl;
    }
};

int main()
{
    std::vector<std::unique_ptr<Something>> stuff;

    for(int i = 0; i < 10; i++) {
        std::unique_ptr<Something> thing(new Something("A nice fun string" + i));
        stuff.push_back(std::move(thing));
    }

    for(uint i = 0; i < stuff.size(); i++) {
        stuff[i]->printDetails();
    }

    return 0;
}

输出:

A nice fun string
 nice fun string
nice fun string
ice fun string
ce fun string
e fun string
 fun string
fun string
un string
n string

2 个答案:

答案 0 :(得分:3)

它没有被感动。 "ABC"是字符串文字,实际上只是一个指针char const *。添加整数只会向前移动,因此"ABC" + 1的行为类似于"BC"

C风格的字符串文字只是字符数组,当您访问其内容时,数组只是指向其第一个元素的指针。因此,添加整数此指针将作为数组的后缀。

你想要的可能是你的文字和整数,你在C ++中并不那么容易。使用C ++ 11的最快方法看起来很糟糕:

string("ABC") + to_string(i)

并且,如果你真的想要char *,那么复制得到的字符串(它已经很好地描述了here

(string("ABC") + to_string(i)).c_str()

答案 1 :(得分:3)

此部分导致错误:

("A nice fun string" + i) 

我必须是char或char *本身,你正在增加i的“一个很好玩的字符串”的索引。