unique_ptr<char*>
时间: 2023-08-06 18:05:59 浏览: 257
这是一个使用了 C++11 中的智能指针 unique_ptr,指向一个 char 类型指针的指针。unique_ptr 会在指针不再需要时自动释放内存,避免了手动管理指针的麻烦。由于 unique_ptr 是独占所有权的智能指针,因此同一时间只能有一个 unique_ptr 指向同一个对象,不能进行复制操作。
相关问题
这段代码为什么在arm上会crash #include <iostream> #include <deque> #include <memory> #include <stdio.h> using namespace std; class Buffer { public: Buffer(int size) { m_buffer = (char*)malloc(size); printf("malloc %d size space\n", size); } ~Buffer() { if (m_buffer) { free(m_buffer); } std::cout<<"buffer xigou"<<std::endl; } Buffer(Buffer&& buffer) { std::cout<<"yidong gouzao"<<std::endl; this->m_buffer = buffer.m_buffer; buffer.m_buffer = nullptr; } private: char* m_buffer; }; class Log { public: Log() { } ~Log() {std::cout<<"xigou"<<std::endl;}; void init() { m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(128))); m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(256))); m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(512))); } void test() { init(); std::cout<<"test ------"<<std::endl; std::unique_ptr<Buffer> tp = nullptr; tp = std::move(m_deque.front()); int i = 1; for (auto it = m_deque.begin() ; it != m_deque.end(); it++) { if (*it == nullptr) { std::cout<<"nullptr "<<i<<std::endl;; } i++; } m_deque.pop_front(); std::cout<<"end -------"<<std::endl; } private: std::deque<std::unique_ptr<Buffer>> m_deque; }; int main() { std::cout << "Hello World!\n"; Log my_log; cout<<"start Log test"<<endl; my_log.test(); cout<<"end Log test"<<endl; }
这段代码在arm上会crash的原因是因为在移动构造函数`Buffer(Buffer&& buffer)`中,没有对移动后`buffer`的指针进行空指针处理,导致在使用`buffer`的指针时出现了未定义的行为。在x86等其他平台上,可能由于内存管理机制的不同,可能不会立即出现问题,但在arm平台上就会出现crash。要修复这个问题,可以在移动构造函数中加入空指针处理,例如将`buffer`的指针设置为`nullptr`。
异常原因#include <iostream> #include<memory> #include<string> using namespace std; class Product { public: virtual void Creat() = 0; }; class ProductA : public Product { public: void Creat() { cout << "创建产品A"; }; }; class ProductB : public Product { public: void Creat() { cout << "创建产品B"; } }; class Factory { public: virtual void makeProduct() = 0; void setProduct(char type_of_product) { if (type_of_product == 'a'){ unique_ptr<Product> productA = make_unique<ProductA>(); this->product = productA.get(); } }; protected: Product* product; }; class Factory1 : public Factory { public: void makeProduct() { cout << "工厂1:"; this->product->Creat(); } }; class Factory2 : public Factory { public: void makeProduct() { cout << "工厂2:"; this->product->Creat(); } }; int main() { unique_ptr<Product> productA = make_unique<ProductA>(); unique_ptr<Factory> factory1 = make_unique<Factory1>(); factory1->setProduct('A'); factory1->makeProduct(); return 0; }
这份代码中存在一些问题:
1. `Factory::setProduct()` 中只有对产品A的处理,没有对产品B的处理。
2. `Factory::product` 指针没有进行初始化,可能会导致程序崩溃。
3. `unique_ptr<Factory> factory1 = make_unique<Factory1>();` 中的 `Factory1` 类没有定义默认构造函数,因此需要手动提供一个构造函数。
以下是修改后的代码:
```
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class Product {
public:
virtual void Creat() = 0;
};
class ProductA : public Product {
public:
void Creat() {
cout << "创建产品A";
};
};
class ProductB : public Product {
public:
void Creat() {
cout << "创建产品B";
}
};
class Factory {
public:
virtual void makeProduct() = 0;
virtual ~Factory() {}
void setProduct(char type_of_product) {
if (type_of_product == 'a') {
unique_ptr<Product> productA = make_unique<ProductA>();
this->product = productA.get();
}
else if (type_of_product == 'b') {
unique_ptr<Product> productB = make_unique<ProductB>();
this->product = productB.get();
}
};
protected:
Product* product = nullptr;
};
class Factory1 : public Factory {
public:
Factory1() {}
void makeProduct() {
cout << "工厂1:";
if (product) {
product->Creat();
}
else {
cout << "未设置产品" << endl;
}
}
};
class Factory2 : public Factory {
public:
Factory2() {}
void makeProduct() {
cout << "工厂2:";
if (product) {
product->Creat();
}
else {
cout << "未设置产品" << endl;
}
}
};
int main() {
unique_ptr<Factory> factory1 = make_unique<Factory1>();
factory1->setProduct('a');
factory1->makeProduct();
return 0;
}
```
修改后的代码中,`Factory::setProduct()` 中加入了对产品B的处理;`Factory::product` 指针进行了初始化;`Factory1` 和 `Factory2` 中分别添加了默认构造函数并且在 `makeProduct()` 中判断是否设置了产品。
阅读全文
相关推荐















