C++ 奇怪的C++;指针新建/删除问题

C++ 奇怪的C++;指针新建/删除问题,c++,pointers,free,C++,Pointers,Free,我毫无头绪。任何帮助都将不胜感激。替换 *** 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

我毫无头绪。任何帮助都将不胜感激。

替换

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

您现在拥有的将分配一个
char
并将其初始化为
16
。要分配数组,必须使用方括号,如上所示

同样,替换

char *data = new char[16];


代码中唯一“奇怪”的是,您正在调用未定义的行为,首先是通过越界访问:

char *res = new char[10];

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

正确的行为显然是,不要使用
new

char *res = new char (10); // pointer to single char, value 10
delete[] res; // Oops, UNDEFINED BEHAVIOUR
#包括
int main(){
std::矢量数据{16};
对于(int i=0;i<16;++i){
数据。at(i)=i;
}
std::向量res{10};
返回0;
}

注意:
data{10}
表示法是C++11初始化语法,它主要等同于
data(10)
,但编译器更容易解析。

9秒的答案,肯定是+1!啊,别再来了!下次请仔细阅读……这到底是怎么回事?+1:明确说明的问题,缩进良好的代码,完整的错误消息,链接到实时示例。一个好问题的所有组成部分都在那里。@H2CO3如果我遗漏了什么,请原谅,但请回复:“不要再问了”-我在OP的问题列表中没有看到任何类似的问题。Patrick,作为将来的参考,
valgrind
早就指出了问题。
char *res = new char(10);
char *res = new char[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
}
char *res = new char (10); // pointer to single char, value 10
delete[] res; // Oops, UNDEFINED BEHAVIOUR
#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;
}