奇怪的c++指针new / delete问题
Strange C++ pointer new / delete issues
#include <iostream>
using namespace std;
int main (int args, char **argv) {
char *data = new char(16);
for (int i = 0; i < 16; ++i) {
data[i] = i; // works fine when commented out, also fails when data[i] = 0
}
char *res = new char (10);
delete[] res;
return 0;
}
给出错误,参见:http://ideone.com/AgZhZB
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x09377018 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7519ee2]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb76f751f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdaPv+0x1b)[0xb76f757b]
./a.out[0x80485af]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb74bd4d3]
./a.out[0x80484b1]
我毫无头绪。
Replace
char *data = new char(16);
char *data = new char[16];
您现在所拥有的分配单个char
并将其初始化为16
。要分配数组,必须使用方括号,如上所示。
同样,取代
char *res = new char(10);
char *res = new char[10];
显然,正确的行为是不使用new
。
#include <vector>
int main () {
std::vector<char> data{16};
for (int i = 0; i < 16; ++i) {
data.at(i) = i;
}
std::vector<char> res{10};
return 0;
}
注意:data{10}
符号是c++ 11初始化语法,它基本上相当于data(10)
,但更容易被编译器解析。
在你的代码中唯一可能是"奇怪"的是你调用未定义的行为,首先通过越界访问:
char *data = new char(16); // pointer to single char, value 16
for (int i = 0; i < 16; ++i) {
data[i] = i; // out of bounds access: UNDEFINED BEHAVIOUR
}
然后,在需要delete
时调用delete[]
:
char *res = new char (10); // pointer to single char, value 10
delete[] res; // Oops, UNDEFINED BEHAVIOUR
当你得到未定义的行为时,任何事情都可能发生。它不一定是可复制的,所以它可能看起来很"奇怪"。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- delete[]有问题,如何部分删除内存
- 关于操作符new()和操作符delete()的问题
- New和delete处理多线程问题
- 涉及数组指针时delete[]操作符的问题
- 使用char *和delete的问题
- CMFC "Delete"的网格属性问题
- 奇怪的c++指针new / delete问题
- 关键字"delete"问题