C ++动态变量和未定义的存储之间的差异

问题描述 投票:-1回答:4

我刚才学习C ++的动态变量的概念。我碰到的第一个例子是如下。

  int *p1 = new int;
  std::cin >> *p1;
  *p = *p + 5;
  std::cout << *p1;

我在想,如果指针P1没有指向一个动态内存的位置和毋宁说是未初始化的,从我的理解是不确定的行为会发生什么。所以,

  int *p1;
  std::cin >> *p1;
  *p1 = *p1 + 7;
  std::cout << *p1;

我想这一点,并没有奏效。它让我输入从控制台的整数,但没有得到任何输出。这是为什么?即使P1指向一个随机的内存位置,为什么我不能改变任何它所指向的价值?为什么我需要分配p来一个“新”的内存位置?

c++ pointers dynamic-memory-allocation
4个回答
3
投票

这里有几件事情:

  • 当你不初始化变量是不确定它的价值是什么(取决于你的编译器,编译器的设置,你的系统,你的机器当时的状态等)。严格地讲,它无论发生什么事是堆栈上的时间。
  • 操作系统需要保证进程隔离 - 这意味着,如果一个进程行为不端,它没有考虑整个系统崩溃,或影响其他正在运行的进程。这些事情之一是内存保护。每个进程具有记忆它被允许使用。如果随机地址恰好落在这一区域以外,你的程序会崩溃。
  • 如果随机地址允许的范围之内,那么它可能是“无害的”或可能会损坏你的进程栈,堆或其他一些事情,导致后来神秘崩溃。
  • 最后,它不具有指向堆或new一块内存 - 它可能是在栈上。

下面是与堆栈的例子:

int x = 0;
int* p1 = &x;
std::cin >> *p1;
*p1 = *p1 + 7;
std::cout << *p1;
std::cout << x; // x and *p1 refer to the same value

4
投票

它让我输入从控制台的整数,但没有得到任何输出。这是为什么?

如果不是由于程序崩溃(如VorpalSword建议),那么也许当你改写(您已改写任何的记忆单词),这打破了这是取决于它保留了其原有价值标准输出机制的东西。关于未定义行为的事情是,它是不确定的 - 这是说,到底会发生什么将取决于在这个过程中每一个可能受影响的机制是如何工作的具体细节,更确切地说它如何可能会失败时的前提条件这取决于受到了侵犯。在一般情况下,没有人试图记录或表征不确定的行为,因为这将是一个无止境的工作,而且也没有好处在任何情况下这样做,因为反正需要被固定调用未定义行为的程序。

即使P1指向一个随机的内存位置,为什么我不能改变任何它所指向的价值?

那么,你可以 - 但这样做,你调用未定义行为,这意味着没有任何保证以后工作的权利,如果有什么不这样做,你以后想什么,要怪的唯一的人是你:)

为什么我需要分配p来一个“新”的内存位置?

因为如果你打算使用一块内存,你需要使用一块内存的代码没有其他位使用用于其他目的。否则,你所做的任何更改将覆盖任何价值,他们已经摆在那里(反之亦然),导致无论是在你的逻辑或他们的逻辑,或两者意外/无益的行为。

“新的”运营商打破你断位的已知将要 - 不使用中逐人,其他的内存从堆中,这样你可以肯定的是仅适用于您自己私人使用。 “删除”操作符提供了内存回堆,以便它可以被重新用于其他目的,你用它做了。


3
投票

访问一个未初始化的指针是undefined behavior,这基本上意味着任何事情都有可能发生。通常情况下,以下三种情况之一将实际发生:要么程序将立即崩溃,或者它会继续工作。它也工作了一段时间,但后来胡作非为。但是你不能依赖于任何特定结果 - 未定义行为意味着什么事情都可能发生。


1
投票

这可能赛格故障。您是否尝试过单在调试器步进呢?

© www.soinside.com 2019 - 2024. All rights reserved.