【问题标题】:Why Pointer contains some trash?为什么指针包含一些垃圾?
【发布时间】:2015-07-03 18:13:30
【问题描述】:

我有以下代码sn-p:

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。如何用dRAII5 符号创建指针?

【问题讨论】:

    标签: c++ pointers c++11 vector raii


    【解决方案1】:

    因为container.data() 不是以null 结尾的,所以该指针不指向C 风格的字符串。您已将 5 个ds 放在那里,但在这些字节之后只是未分配的内存。当您尝试流式传输它时,它会一直持续下去,直到其中一个未分配的字节恰好是 \0

    为了有效地打印const char*,它必须以\0 结尾。您可以通过以下方式验证:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      关于你的第二个问题,

      如何用 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';
      }
      

      (顺便说一句,您的代码 sn-p 无法编译)

      【讨论】:

        猜你喜欢
        • 2021-09-16
        • 1970-01-01
        • 2015-01-20
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 2014-01-06
        • 2016-05-16
        • 2020-08-29
        相关资源
        最近更新 更多