如何调整属于 class 的唯一指针的字符数组的大小。它必须在程序的整个生命周期内保持存活
How to resize a char array of unique pointer belonging to a class. It must be kept alive for the whole life of the program
我有一个名为 class 的容器,其中包含一个 std::unique_ptr _ptr。
这个 _ptr 必须在程序的整个过程中保持活动状态。我不能失去它。当最后容器对象被销毁。它将一起被摧毁。
在节目的某个部分。我需要向 _ptr 数组添加一个字符。为此,我使用以下函数:
void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
newptr[strlen(newptr.get())]= 'X';
newptr[strlen(newptr.get()) + 1]= '[=11=]';
ptr = std::move(newptr);
}
约束
我很确定我做错了什么。在我的项目中,有时我会丢失 _ptr 的内容,有时则不会。有趣的是,valgrind 没有给出任何警告。
我不能用字符串代替 std::unique_ptr 因为我以后必须使用 const_cast 这就像强奸我创建的字符串。
我尝试使用 vector 并通过 .data() 将其分配给 char *。但是 Valgrind 发疯了,给了我各种读写错误
问题是 C 库及其 char* rawPointer。真的很难绕过它。我不能只使用新的字符。因为我将不得不在整个程序中随身携带它。
问题
Char 唯一指针数组_ptr 的大小调整是否正确?
源代码
#include <iostream>
#include <string>
#include <memory>
#include <string.h>
class Container {
public:
Container(const std::string &data):_data(data),_ptr(new char[data.size() + 1]) {}
std::unique_ptr<char[]> & initPtr(){
strcpy(_ptr.get(),_data.c_str());
_ptr[strlen(_ptr.get()) + 1] = '[=12=]';
return _ptr;
}
private:
std::unique_ptr<char[]> _ptr;
std::string _data;
};
void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
newptr[strlen(newptr.get())]= 'X';
newptr[strlen(newptr.get()) + 1]= '[=12=]';
ptr = std::move(newptr);
}
int main()
{
std::string name = "hello";
Container c(name);
std::unique_ptr<char[]> &ptr = c.initPtr();
resizeUniquePtrArray(ptr);
char* rawPointer = ptr.get();
std::cout<< rawPointer << std::endl;
//API LIBRARY CALL TO rawPointer it's a looonng process
return 0;
}
I can't use a std::string
instead of std::unique_ptr
because i'll have to use later on const_cast
it's like raping the string that I created.
不需要 const_cast
来获取指向底层 C 字符串的普通指针:
std::string s("abc");
char* p = &s[0];
或者,在 C++17 中:
char* q = s.data();
我有一个名为 class 的容器,其中包含一个 std::unique_ptr _ptr。 这个 _ptr 必须在程序的整个过程中保持活动状态。我不能失去它。当最后容器对象被销毁。它将一起被摧毁。
在节目的某个部分。我需要向 _ptr 数组添加一个字符。为此,我使用以下函数:
void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
newptr[strlen(newptr.get())]= 'X';
newptr[strlen(newptr.get()) + 1]= '[=11=]';
ptr = std::move(newptr);
}
约束
我很确定我做错了什么。在我的项目中,有时我会丢失 _ptr 的内容,有时则不会。有趣的是,valgrind 没有给出任何警告。
我不能用字符串代替 std::unique_ptr 因为我以后必须使用 const_cast 这就像强奸我创建的字符串。
我尝试使用 vector 并通过 .data() 将其分配给 char *。但是 Valgrind 发疯了,给了我各种读写错误
问题是 C 库及其 char* rawPointer。真的很难绕过它。我不能只使用新的字符。因为我将不得不在整个程序中随身携带它。
问题
Char 唯一指针数组_ptr 的大小调整是否正确?
源代码
#include <iostream>
#include <string>
#include <memory>
#include <string.h>
class Container {
public:
Container(const std::string &data):_data(data),_ptr(new char[data.size() + 1]) {}
std::unique_ptr<char[]> & initPtr(){
strcpy(_ptr.get(),_data.c_str());
_ptr[strlen(_ptr.get()) + 1] = '[=12=]';
return _ptr;
}
private:
std::unique_ptr<char[]> _ptr;
std::string _data;
};
void resizeUniquePtrArray(std::unique_ptr<char[]> &ptr) {
std::unique_ptr<char[]> newptr(new char[strlen(ptr.get())+2]);
memcpy(newptr.get(), ptr.get(),strlen(ptr.get()));
newptr[strlen(newptr.get())]= 'X';
newptr[strlen(newptr.get()) + 1]= '[=12=]';
ptr = std::move(newptr);
}
int main()
{
std::string name = "hello";
Container c(name);
std::unique_ptr<char[]> &ptr = c.initPtr();
resizeUniquePtrArray(ptr);
char* rawPointer = ptr.get();
std::cout<< rawPointer << std::endl;
//API LIBRARY CALL TO rawPointer it's a looonng process
return 0;
}
I can't use a
std::string
instead ofstd::unique_ptr
because i'll have to use later onconst_cast
it's like raping the string that I created.
不需要 const_cast
来获取指向底层 C 字符串的普通指针:
std::string s("abc");
char* p = &s[0];
或者,在 C++17 中:
char* q = s.data();