为什么指针包含一些垃圾?
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
符号创建指针 d
和 RAII
?
因为 container.data()
不是空终止的,所以指针不指向 C 风格的字符串。你在那里放了 5 d
s,但在这些字节之后只是未分配的内存。当您尝试流式传输它时,它会一直继续,直到其中一个未分配的字节恰好是 [=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 所展示的,您的指针实际上只包含 d
s
关于你的第二个问题,
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';
}
(顺便说一下,您的代码片段无法编译)
我有以下代码片段:
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
?
因为 container.data()
不是空终止的,所以指针不指向 C 风格的字符串。你在那里放了 5 d
s,但在这些字节之后只是未分配的内存。当您尝试流式传输它时,它会一直继续,直到其中一个未分配的字节恰好是 [=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 所展示的,您的指针实际上只包含 d
s
关于你的第二个问题,
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';
}
(顺便说一下,您的代码片段无法编译)