C++ 如果在C+;中的malloc()之后调用free()时出错+;

C++ 如果在C+;中的malloc()之后调用free()时出错+;,c++,memory,malloc,C++,Memory,Malloc,我为调用test的数组分配空间,该数组将具有double类型的(2*n+1)个元素。我填充数组,最后释放它。但是如果我使用free(),我会得到一个错误:“double-free或corruption(out):0x0000000000000f1dc20”。如果我使用comment free(),代码将运行。我看不出这个问题 using namespace std; #include <iostream> #include <stdio.h> #include <s

我为调用test的数组分配空间,该数组将具有double类型的(2*n+1)个元素。我填充数组,最后释放它。但是如果我使用free(),我会得到一个错误:“double-free或corruption(out):0x0000000000000f1dc20”。如果我使用comment free(),代码将运行。我看不出这个问题

using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

long    n=512; //grid size
double *test;

int main() 
{
    test = (double*) malloc(sizeof(double) * (2*n+1));

    for (long j=-n;j<=n;j++)
    {
        test[j] = double(j);
    }

    free(test); //<--- gives me error if I use this
    return 0;
 }
使用名称空间std;
#包括
#包括
#包括
#包括
#包括
长n=512//网格大小
双重*试验;
int main()
{
测试=(双*)malloc(sizeof(双)*(2*n+1));

对于(长j=-n;j不,那就不行了

您为2n个双精度数组分配了足够的空间,但C定义了范围为[0..2n-1]的数组索引。您不能任意决定使用[-n..+n]访问元素。如注释中所述,这是未定义的行为

如果您需要执行看起来正在执行的操作,则必须为所有访问使用偏移量,例如:

test[j+n] = double(j);

这样,您就更有可能不破坏堆结构,从而从您的C和/或OS内存管理器中收到恼人的错误消息。

不,那不行

您为2n个双精度数组分配了足够的空间,但C定义了范围为[0..2n-1]的数组索引。您不能任意决定使用[-n..+n]访问元素。如注释中所述,这是未定义的行为

如果您需要执行看起来正在执行的操作,则必须为所有访问使用偏移量,例如:

test[j+n] = double(j);

你有更好的机会不破坏你的堆结构,所以从C和/或OS内存管理器中得到恼人的错误消息。< /P>这是C和C++的混合体。在C++中,你应该使用<代码>新< /COD>和<代码>删除<代码>,而不是<代码> Malc C < /C> >和<代码>免费< /C>。STD:<代码> >或代码> STD::MaMuxAudio/<代码> < <代码> > <代码> >删除>代码>,C代码头包括前缀字母C,如<代码>包含< <代码> >包含< <代码> >。这里不能使用否定索引。在C++中,应避免<代码> MalcC <代码> /<代码>免费< /代码>。<代码>新< /代码>> /<代码>删除< /Cord>是手动内存分配的C++方式。即:“代码> STD::代码<代码>:STD::UNQUIGYPPTR <代码>,或代码> STD::SysDypPTR < /C> >。您只能写入<代码>测试(0)< /代码>直至测试[2 *N]。。你写的是“代码> j= -n。不要违反程序约束,也不会中断。如果空指针由<代码> MalOC 新< /COD>和<代码>删除<代码>,而不是<代码> MALLC/<代码>和<代码>免费< /代码>。,更喜欢容器和

std::make_unique
std::make_shared
而不是
new
/
delete
。此外,c标题使用前缀字母c包含,例如
#include
而不是
#include
。您不能在这里使用负索引。您应该避免
malloc
//code> > C++ >代码>新< /COD> > />代码>删除< /C++ >是手动内存分配的C++方式。即:“代码> STD::矢量<代码>,代码> STD::UngQuyPPTR <代码>,或代码> STD::SyrdYPPTR < /C> >,您只能写入 Test[0 ] < /COD>直至 Test[2*n]。
。您写入的内容超出了
j=-n
的范围。不要违反程序约束,它也不会中断。此外,您也不会测试
malloc是否返回空指针