2015-04-24 32 views
3

我有下面的代码片段:为什么指针包含一些垃圾?

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创建指针d的符号与RAII

回答

7

因为不是空终止的,所以指针不指向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_也是一样的。您分配给空终止足够的内存,你只是不得不添加:

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

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

嗯,巴里证明,你的指针实际上只包含d小号

而关于你的第二个问题,

如何用RAII的5个符号创建指针?

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

(顺便说一句,您的代码段不编译)

+0

谢谢你的回答。 – Denis