C++ 唯一ptr中的奇怪故障
在我的代码中进行了一个小的修改之后,我在运行它时遇到了一个segfault,我不知道为什么 代码如下:C++ 唯一ptr中的奇怪故障,c++,segmentation-fault,unique-ptr,C++,Segmentation Fault,Unique Ptr,在我的代码中进行了一个小的修改之后,我在运行它时遇到了一个segfault,我不知道为什么 代码如下: std::shared_ptr<UCHAR> myClass::myMethod(const char *str) { size_t strLen = strlen(str); ULONG paddedLen = (strLen % this->bufferLen) ? ((strLen / blockSize) + 1) * this->
std::shared_ptr<UCHAR> myClass::myMethod(const char *str)
{
size_t strLen = strlen(str);
ULONG paddedLen = (strLen % this->bufferLen)
? ((strLen / blockSize) + 1) * this->bufferLen
: strLen;
std::unique_ptr<UCHAR> padded = std::make_unique<UCHAR>(paddedLen);
memset(padded.get(), 0, paddedLen);
memcpy(padded.get(), str, strLen);
std::unique_ptr<UCHAR> buffer = std::make_unique<UCHAR>(this->bufferLen);
memcpy(buffer.get(), this->buffer, this->bufferLen);
...
}
std::shared\ptr myClass::myMethod(const char*str)
{
尺寸\u t strLen=strLen(str);
ULONG paddedLen=(strLen%this->bufferLen)
((strLen/blockSize)+1)*此->缓冲区
:斯特伦;
std::unique_ptr padded=std::make_unique(paddedLen);
memset(padded.get(),0,paddedLen);
memcpy(padded.get(),str,strLen);
std::unique\u ptr buffer=std::make_unique(此->bufferLen);
memcpy(buffer.get(),this->buffer,this->bufferLen);
...
}
下面是失败的代码:
std::shared_ptr<UCHAR> myClass::myMethod(const char *str)
{
size_t strLen = strlen(str);
ULONG paddedLen = (strLen % this->bufferLen)
? ((strLen / blockSize) + 1) * this->bufferLen
: strLen;
std::unique_ptr<UCHAR> padded = std::make_unique<UCHAR>(paddedLen + 1); <-- Added +1 here
memset(padded.get(), 0, paddedLen + 1); <--Added +1 here
memcpy(padded.get(), str, strLen);
std::unique_ptr<UCHAR> buffer = std::make_unique<UCHAR>(this->bufferLen); <---Crashes here
memcpy(buffer.get(), this->buffer, this->bufferLen);
...
}
std::shared\ptr myClass::myMethod(const char*str)
{
尺寸\u t strLen=strLen(str);
ULONG paddedLen=(strLen%this->bufferLen)
((strLen/blockSize)+1)*此->缓冲区
:斯特伦;
std::unique_ptr padded=std::make_unique(paddedLen+1);bufferLen);
...
}
唯一的区别是我在分配填充和memsetting时添加了+1
它在生成第二个唯一指针时崩溃
我的代码/te使用唯一ptr的方式是否有任何问题
有关信息:在Windows上使用QMake和Mingw 7.3.0 32位编译std::unique\u ptr padded=std::make_unique(paddedLen+1);
std::unique_ptr<UCHAR> padded = std::make_unique<UCHAR>(paddedLen + 1);
memset(padded.get(), 0, paddedLen + 1); <--Added +1 here
memcpy(padded.get(), str, strLen);
memset(padded.get(),0,paddedLen+1);
也就是说,可以使用std::vector
来简化:
std::向量填充(paddedLen+1,0);
std::copy_n(str、strLen、padded.begin());
std::向量缓冲区(this->bufferLen);
std::copy_n(this->buffer,this->bufferLen,buffer.begin());
...
您的意思是使用使您独一无二吗make_unique
生成单个T
和make_unique(n)
生成一个大小为n
的T
数组。右<代码>标准::唯一\u ptr padded=标准::使唯一(paddedLen)
不为数组分配空间。@FrançoisAndrieux哦,是的,你说得对,我尝试越来越多地使用智能指针来限制原始指针的使用,以前从未在数组中使用过智能指针。非常令人惊讶的是,第一个代码示例确实起作用了……后来在函数中,我使用了一些需要Uchar数组的windows库,这就是为什么我使用数组而不是向量。否则,yes vectors可能是一个更好的主意。std::vector
只是动态分配数组的包装器。您可以在使用唯一\u ptr
数组的任何位置使用向量的数组。您可以使用vector
的data()
方法获取指向数组的指针,就像使用unique\u ptr
的get()
方法一样。噢,我不知道这一点。很高兴每天都在学习,谢谢。
std::unique_ptr<UCHAR> padded = std::make_unique<UCHAR>(paddedLen + 1); <-- Added +1 here
std::unique_ptr<UCHAR> buffer = std::make_unique<UCHAR>(this->bufferLen); <---Crashes here