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

时间:2015-04-24 23:56:04

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

我有以下代码段:

$scope.showPosition = function (position) {
 // ...
}

$scope.getLocation = function () {
 if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition($scope.showPosition, $scope.showError);
 }
 else {
  $scope.error = "Geolocation is not supported by this browser.";
 }
}

我不明白,为什么我的指针不仅包含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的{​​{1}}符号创建指针?

2 个答案:

答案 0 :(得分:7)

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

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

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

container.push_back('\0');
std::cout << container.data();

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

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

答案 1 :(得分:1)

  

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

好吧,正如Barry所说,你的指针实际上只包含d s

关于你的第二个问题,

  

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

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