为什么指针包含一些垃圾

Why Pointer contains some trash?

本文关键字:包含一 指针 为什么      更新时间:2023-10-16

我有以下代码片段:

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.如何用RAII创建带有d 5符号的指针?

因为container.data()不是以 null 结尾的,所以指针不指向 C 样式的字符串。您已经在那里放置了 5 个d,但在这些字节之后只是未分配的内存。当您尝试流式传输它时,它只会继续运行,直到其中一个未分配的字节恰好是

为了有效地打印const char*,它必须以 结尾。您可以使用以下方法进行验证:

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

str_也是一样.您为空终止符分配了足够的内存,只需添加它:

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

。为什么我的指针不仅包含d

好吧,正如Barry所演示的那样,您的指针实际上只包含d

关于你的第二个问题,

如何使用 RAII 创建带有 5 个 d 符号的指针?

您可以使用以下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';
}

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