C++ new和malloc返回的空指针,为什么?

C++ new和malloc返回的空指针,为什么?,c++,visual-c++,memory-management,C++,Visual C++,Memory Management,给我一个例外。我试着用malloc和calloc获取我的记忆,我得到了什么?空指针!!我的机器上有4吉比特的ram,我不可能不能在这里获得9字节的内存。我一点也不明白 对于那些拥有Visual Studio 2008并希望在相同环境下进行测试的用户,您需要文件graph.txt,该文件如下: v0 = new char(N); 我认为这是一个机器问题,所以我回到家,我在我的台式电脑上尝试了这个程序,它是相同的问题 我必须尝试GCC,但是因为我总是使用VisualC++,我想解决这个环境中的问题

给我一个例外。我试着用malloc和calloc获取我的记忆,我得到了什么?空指针!!我的机器上有4吉比特的ram,我不可能不能在这里获得9字节的内存。我一点也不明白

对于那些拥有Visual Studio 2008并希望在相同环境下进行测试的用户,您需要文件graph.txt,该文件如下:

v0 = new char(N);
我认为这是一个机器问题,所以我回到家,我在我的台式电脑上尝试了这个程序,它是相同的问题

我必须尝试GCC,但是因为我总是使用VisualC++,我想解决这个环境中的问题……/P> 编辑:下面的代码现在可以工作了。出于某种原因,如果你在第一个new中使用括号,它将起作用,但下次使用new时,它将不起作用!! 如果我使用[]语法放置这两个新分配,它就可以工作。如果我将第一个新分配与[]放在一起,第二个与()放在一起,它也可以工作。奇怪的不管怎样,从现在起我将使用[]。。。谢谢大家。

您应该使用

9 20
0 1
0 2
1 0
1 2
1 3
1 5
2 0
2 1
2 3
3 1
3 2
3 4
4 3
5 1
5 6
5 7
6 5
6 8
7 5
8 6
记得带着它自由

matrice = new char[nbr1 * nbr1];

我无法测试你的代码,但你做了一些不干净的事情

您不需要初始化变量
intn
你至少应该写
intn=0

如果您的循环使N没有按您想要的方式初始化,那么您的N是一个随机整数,可能远远大于与
new
一起使用时可用的内存

只是我的一个小小的假设


编辑:我无法测试你的代码,因为我没有你的“graph.txt”。。。因此,我没有从文件中读到任何内容,直接的问题是使用圆括号而不是方括号

但是使用std::vector而不是原始数组。它为您进行分配和解除分配。没错


干杯&hth.,

您的代码有一个错误:

delete[] matrice;
您可能是指“newchar[N]”来分配N个字符。但您的代码只分配1个值为N的字节。然后您将内存从V0覆盖到VO+N-1到1。谁知道您在这里覆盖的内存是什么。

v0=new char(N)分配一个值为N的字符。您的意思是分配一个数组吗


除此之外,你的问题有点令人困惑。它是否返回null或引发异常。同一行不能同时做这两件事。

我想你犯了几个错误

  • 当然,至少是一个小的编码,因为正如sje397所指出的,您分配的是单个字符,而不是数组。我希望你知道其中的区别,这只是一个打字错误

  • <> LI> < P>一个更为严肃的使用C++的方法,不首先读任何东西(没有人知道C++会使用<代码>新< /代码>……这是STD::向量的一个工作。C++不是一种你可以通过实验来学习到任何程度的语言。这很悲伤,但这是事实。。。在C++中,当你犯错时,你会得到可怕的未定义行为怪物,这不是一个简单的学习方法;这也是特别真实的C++,因为语言是复杂的和不合逻辑的在许多领域,它是这样的,因为历史意外(遗产,青年错误,委员会的影响)…无论你多么聪明,你都无法猜测历史:历史必须被研究。如果你对学习C++感兴趣,那么请你自己做一个好手,选一本好的C++书,先读一读…C++是一种非常强大的武器,但如果你尝试从错误的一面攻击它,它很容易成为你最可怕的噩梦。
  • 态度非常严肃。当程序出现问题时,99.999%的问题出现在代码中。这不是编译器中的错误。这不是操作系统中的错误。这不是有缺陷的RAM。只是你的代码错了,所以你必须搜索并修复这个问题。保持先认为问题出在别人的代码中的习惯不会真正让你在编程方面走得更远


  • 当控件带异常到达该行时,
    N
    的值是多少?您确定异常不在这里吗<代码>内存集(v0,1,N)不,它是在尝试做MeMSET之前发生的。括号分配一个字符,并将其初始化为N方括号。我们有“代码> > Boo::数组< /COD>或<代码> STD::C++中的动态数组的向量< /代码>,BTW.,你建议我使用[]而不是(),但是它也做同样的事情。@ TOTO:没有
    new char[n]
    分配
    n
    未初始化的字符,而
    new char(n)
    分配一个初始化为值
    n
    @Kos的字符:每个人都这么认为,但自从在windows下编写dll插件以来,我在一些小事情上避免了STL,其中包括标准库大大增加了dll的大小。我想事情可能在…之后有所改善,或者有些情况下STL不合适。@sje397:如果每次编写函数时都要重新设计轮子,为什么会有人想使用dll而不是STL?这就是它的目的。你永远无法正确地管理自己的记忆。这也是我所想的+1.另外,我想补充的是,如果你一直打开警告,这样的事情会更容易避免。@Cam似乎我们都在未初始化整数的噩梦中犯错;-)@toto ok这不是问题所在,但您不应该以这种方式编写代码。尽可能地初始化变量。这就是为什么在下午2:00之后编写代码是不好的。这是午饭后的时间。最好睡一两个小时:)我还年轻,还在上大学。我选择了学习+睡眠,但没有女孩,所以我有充足的睡眠,谢谢你,即使我在晚上哭泣。不,括号在分配单个字符时是有效的。这是将值传递给构造函数的语法。@Jonathan:wtf。你是说“不”吗?你其余的评论,是的,字面上是正确的,但你有没有检查代码是关于什么的?我承认我花了利米
    delete[] matrice;
    
    //Initialiser v0
    v0 = new char(N);
    memset(v0, 1, N);