C ++动态内存分配无法按预期工作

时间:2017-10-25 23:04:33

标签: c++ dynamic-memory-allocation

我正试图解决为什么这样做的问题。据我所知,当我动态分配3个整数时,它不应该让我在索引2之后添加更多,但下面的代码编译并运行得非常好。这是为什么?

#include <iostream>
int main() {
    int* nums = new int[3];
    nums[0] = 5;
    nums[1] = 6;
    nums[2] = 5;

    nums[3] = 7;
    nums[4] = 8;

    for(int i = 0; i <= 4; i++) {
        std::cout << nums[i] << std::endl;
    }

    delete nums;

    return 0;
}

2 个答案:

答案 0 :(得分:0)

如评论中所述,您正在访问其他内存并在行上为其分配值:

nums[3] = 7;
nums[4] = 8;

由于您为阵列分配了3个插槽,因此需要分配内存,但是当您使用pointers时,您可以直接访问内存位置,这样您就可以自由地跳出你的数组内存空间并冒险进入unknown内存。

这是非常糟糕练习,因为您不知道这些内存位置上的内容。

答案 1 :(得分:-1)

C ++是一种不安全的语言。如果在堆上分配3个int,则必须确保以后不要尝试写入第4个或第5个int的位置。 C ++会允许你在那里写,即使这是一个坏主意。

这个问题的一个解决方案是几乎从不使用语言中内置的指针。你可以制作或使用别人的指针类。它应该是一个模板类,这样你就可以指向任何东西:pntr<int>pntr<Car>pntr<ostream>pntr<string>等......

过载:

  • operator new[]
  • deference运算符,
  • 操作员支架 - 支架
  • 等...

如果您尝试写入不应该的位置,您的指针类可能会抛出错误。

#include <iostream>
#include "pntr.h"

int main() {
    pntr<int> nums = new int[3];
    nums[0] = 5;
    nums[1] = 6;
    nums[2] = 5;    
    nums[3] = 7; // THROWS AN ERROR
    nums[4] = 8; 

    delete nums;

    return 0;
}