奇怪的c++指针new / delete问题

Strange C++ pointer new / delete issues

本文关键字:delete 问题 new 指针 c++      更新时间:2023-10-16
#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

当你得到未定义的行为时,任何事情都可能发生。它不一定是可复制的,所以它可能看起来很"奇怪"。