如下代码为何在arm芯片上运行发生crash #include <iostream> #include <deque> #include <memory> #include <stdio.h> using namespace std; class Buffer { public: Buffer(int size) { m_buffer = new char[size]; printf("malloc %d size space\n", size); } ~Buffer() { if (m_buffer) { delete [] 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; }
时间: 2024-03-27 07:41:24 浏览: 13
这段代码在 ARM 芯片上崩溃的原因可能是因为在 ARM 架构中,对于未初始化的指针,其默认值是一个非法地址,而在 x86 架构中,对于未初始化的指针,其默认值为 NULL。在这段代码中,当 m_deque 中的指针被移动(std::move)后,其原来的位置被设置为 nullptr,但是在迭代器遍历时,可能会遇到这些被设置为 nullptr 的指针,导致程序崩溃。
因此,你可以在遍历时加上一个判断,判断当前指针是否为 nullptr,如果是,则跳过该指针的遍历。例如:
```
for (auto it = m_deque.begin(); it != m_deque.end(); it++) {
if (*it == nullptr) {
continue;
}
// ...
}
```
相关问题
#include <stdlib.h> #include <stdio.h> #include <iostream> #include <string>
#include <stdlib.h> 是C语言标准库中的一个头文件,它提供了一些常用的函数和宏定义,用于处理内存分配、随机数生成、字符串转换等操作。
#include <stdio.h> 是C语言标准库中的另一个头文件,它提供了输入输出相关的函数和宏定义,用于读取和写入数据。
#include <iostream> 是C++标准库中的一个头文件,它包含了C++中输入输出流的定义,提供了cin、cout等对象和相关操作符,用于方便地进行输入输出操作。
#include <string> 是C++标准库中的另一个头文件,它定义了字符串类string及其相关操作,提供了方便的字符串处理功能。
这些头文件是编程中常用的头文件,通过包含它们可以使用其中定义的函数、类和宏等功能来完成相应的操作。
#include<iostream>与#include<stdio.h>的区别
#include<iostream> 和#include<stdio.h>是两个不同的头文件引用语句,它们有以下区别:
1. 功能:#include<iostream> 是C++标准库中的头文件,用于输入输出操作,包含了cin、cout等对象和函数的定义。而#include<stdio.h>是C语言标准库中的头文件,用于输入输出操作,包含了printf、scanf等函数的定义。
2. 命名空间:#include<iostream> 引入的是std命名空间,需要使用std::cout、std::cin等来访问其中的元素。而#include<stdio.h>没有命名空间的概念,函数名直接使用即可。
3. 扩展名:#include<iostream> 的头文件没有扩展名,因为它是C++标准库中的头文件。而#include<stdio.h>的头文件扩展名为.h,因为它是C语言标准库中的头文件。
4. 文件位置:#include<iostream> 是C++标准库中的头文件,通常位于编译器的include路径中。而#include<stdio.h>是C语言标准库中的头文件,也位于编译器的include路径中。
总之,#include<iostream> 用于C++程序中,提供了更方便的输入输出操作;而#include<stdio.h> 用于C程序中,提供了基本的输入输出功能。