C++ 唯一ptr中的奇怪故障

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->

在我的代码中进行了一个小的修改之后,我在运行它时遇到了一个segfault,我不知道为什么

代码如下:

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