为什么指针包含一些垃圾?

Why Pointer contains some trash?

我有以下代码片段:

size_t size = 5;
std::vector<char> container(size, 'd');

std::copy(container.begin(), container.begin() + size,
    std::ostream_iterator<char>(std::cout, " ")); // d d d d d

auto ptr = containter.data();
//ptr == dddddTRASHTRASH why??

char* str_ = new char[size + 1];
memcpy(str_, container.data, size * sizeof(char));

std::cout << str_ << std::endl; // dddddTRASHTRASHTRASH!!!!

我不明白,为什么我的指针不仅包含d。如何用 5 符号创建指针 dRAII?

因为 container.data() 不是空终止的,所以指针不指向 C 风格的字符串。你在那里放了 5 ds,但在这些字节之后只是未分配的内存。当您尝试流式传输它时,它会一直继续,直到其中一个未分配的字节恰好是 [=14=].

为了有效打印 const char*,它必须以 [=14=] 结尾。您可以通过以下方式验证:

size_t size = 5;
std::vector<char> container(size, 'd');

container.push_back('[=10=]');
std::cout << container.data();

str_ 也是如此。您为空终止符分配了足够的内存,只需添加它即可:

char* str_ = new char[size + 1];
memcpy(str_, container.data, size * sizeof(char));
str_[size] = '[=11=]'; // need this

... why my pointer contains not only d

好吧,正如 Barry 所展示的,您的指针实际上只包含 ds

关于你的第二个问题,

How to create pointer with 5 symbols of d with RAII?

您可以使用 unique_ptr:

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <memory>

int main()
{
    size_t size = 5;
    std::vector<char> container(size, 'd');

    std::copy(container.begin(), container.begin() + size,
              std::ostream_iterator<char>(std::cout, " ")); // d d d d d
    std::cout << '\n';

    std::unique_ptr<char[]> p(new char[size]);
    for(size_t i=0; i<size; ++i)
        p[i] = 'd';

    for(size_t i=0; i<size; ++i)
        std::cout << p[i] << ' ';
    std::cout << '\n';
}

(顺便说一下,您的代码片段无法编译)