相关疑难解决方法(0)

将大文件读入数组会导致崩溃

我有一项任务,我需要输入一个7位数的输入(电话号码)并检查它是否在pi的数字中找到.pi的数字存储在提供的空格分隔文本文件中.这似乎相当简单:将输入分解为数组,将pi的数字读入数组,并检查是否找到匹配项.长话短说,我让这个程序让我满意.我们提供了文本文档,其中pi的数字为10,100的倍数,依此类推,最多可达100万个数字.我的程序最多可达100,000个数字.但无论出于何种原因,在100万个数字文件中,它会因通用的Windows错误而崩溃.我没有关于它为什么崩溃并且没有给出错误消息的信息(除了通用的"导致该程序停止工作的问题"消息).

注意到赋值状态的限制我不能使用任何面向对象的代码,除了cin,cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们使用函数而不知道他们是如何工作的).

无论如何,我正在寻找有关程序崩溃原因的见解.我对需要它们的每个变量(包括计数器和函数返回)都使用了很长时间,这应该足够了,因为它们可以达到大约20亿,而且这里不应该有任何超过一百万的数字.

谢谢你的帮助.过去几个小时我一直在这里没有成功.

const long int numberOfDigits = 1000000;
int digitsOfPi[numberOfDigits];
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
1139
查看次数

为什么不能在堆栈上释放变量?

有问题的语言是C/C++.

我的教授说当你完成使用它时释放堆上的内存,因为否则你最终会得到无法访问的内存.这样做的问题是你可能最终耗尽了所有内存,而且你无法访问它们.

为什么相同的概念不适用于堆栈?我知道你总是可以访问你在堆栈中使用的内存,但如果你不断创建新的变量,你最终会用完空间吗?那么为什么你不能在堆栈上释放变量来为堆上的新变量腾出空间呢?

我得到编译器释放堆栈上的变量,但那是在变量范围的末尾.它是否也在其范围的末尾释放堆上的变量?如果没有,为什么不呢?

c c++ memory heap stack

3
推荐指数
3
解决办法
1545
查看次数

内存,缓冲区和堆栈有什么区别?

虽然学习c编程只memory提到了.但实际上似乎还有更多; 这些bufferstack文字几乎就在那里.

这些条款有什么区别?为什么他们很有趣?

拜托,我需要一个详细的答案.简短的答案无法提供服务.一些资源也可能有所帮助.

提前坦克.

c memory stack buffer

3
推荐指数
1
解决办法
1万
查看次数

在C中输入大字符串

对于一个特定的问题,我必须从用户那里获取大小介于其间的字符串输入1 and 10^5.我使用了以下代码

char *a;
a = malloc(100000*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

并且在循环内(t指的是测试用例的数量)

while( t-- )
{
  scanf( "%d", &n );
  scanf( "%s", a );
  .....
}
Run Code Online (Sandbox Code Playgroud)

n是用户在运行时输入的字符串的长度.问题是这给了我"超出时间限制"

我对上面的代码做了一些修改,

 while( t-- )
 {
   scanf( "%d", &n );
   char a[n];
   scanf( "%s", a );
   ....
 }
Run Code Online (Sandbox Code Playgroud)

没有"TLE",这完全没问题.但我不明白为什么.使用第一个代码的原因是由于内存分配只进行一次,因此节省了时间.我错了吗?请解释.

c string memory-management

3
推荐指数
1
解决办法
1715
查看次数

为什么拆箱比拳击快100倍

为什么拳击和拆箱操作之间的速度变化如此之大?有10倍的差异.我们什么时候应该关心这个?上周Azure支持告诉我们,我们的应用程序的堆内存中存在问题.我很想知道它是否与装箱拆箱问题有关.

using System;
using System.Diagnostics;

namespace ConsoleBoxing
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Program started");
        var elapsed = Boxing();
        Unboxing(elapsed);
        Console.WriteLine("Program ended");
        Console.Read();
    }

    private static void Unboxing(double boxingtime)
    {
        Stopwatch s = new Stopwatch();
        s.Start();
        for (int i = 0; i < 1000000; i++)
        {
            int a = 33;//DATA GOES TO STACK
            object b = a;//HEAP IS REFERENCED
            int c = (int)b;//unboxing only hEre ....HEAP GOES TO STACK
        }
        s.Stop();

        var UnBoxing =  s.Elapsed.TotalMilliseconds- boxingtime;
        Console.WriteLine("UnBoxing …
Run Code Online (Sandbox Code Playgroud)

c# memory performance

3
推荐指数
2
解决办法
1310
查看次数

使用数组视图时出现意外的内存分配(julia)

我正在尝试在数组X中搜索所需的模式(变量模板).模板的长度为9.

我做的事情如下:

function check_alloc{T <: ZeroOne}(x :: AbstractArray{T}, temp :: AbstractArray{T})
    s = 0
    for i in 1 : 1000
        myView = view(x, i : i + 9)
        if myView == temp
            s += 1
        end
    end
    return s
end
Run Code Online (Sandbox Code Playgroud)

并在此短循环中获得意外的内存分配(46 KB).为什么会发生这种情况?如何防止内存分配和性能下降?

arrays performance allocation julia

3
推荐指数
1
解决办法
666
查看次数

为什么 char16_t 被定义为与 uint_least16_t 而不是 uint16_t 具有相同的大小?

阅读 C++17 草案 §6.9.1/5:

类型char16_tchar32_t分别表示不同类型的具有相同的大小,符号性,和对准如uint_least16_tuint_least32_t,分别在<cstdint>被称为底层类型。

现在参考 C11 草案 §7.20.1.2/2,这是 C 库继承的参考:

typedef 名称uint_leastN_t指定宽度至少为N 的无符号整数类型,这样具有较小大小的无符号整数类型至少具有指定的宽度。因此,uint_least16_t表示宽度至少为 16 位的无符号整数类型。

注意“至少”部分。这意味着char16_t实际上可能有例如 32 位,从而形成char16_t一个 UTF-16 原始数据的错误表示的数组。在这种情况下,将此类数组写入二进制文件将导致有效代码单元与 U+0000 字符交替。

是否有充分的理由char16_t根据uint_least16_t而不是来定义uint16_t?或者它只是标准中的一个缺陷?

c++ unicode types utf-16

3
推荐指数
1
解决办法
547
查看次数

为什么我用这个背包问题求解器得到"未知信号11"?

任务

给定n个金条,找到适合容量W的金的最大重量

输入

第一行包含背包的容量W和金条的数量n.下一行包含n个整数

产量

适合容量为W的背包的最大黄金重量.

约束

1 <= W <= 10000; 1 <= n <= 300; 0 <= w0,w1,w2,...,w(n-1)<= 100000

#include <iostream>
#include <vector>
using std::vector;

int optimal_weight(int W, vector<int> w) {
  int n = w.size() + 1;
  int wt = W + 1;
  int array [n][wt];
  int val = 0;

  for(int i = 0; i < wt; i++) array [0][i] = 0;
  for(int i = 0; i < n; i++) array …
Run Code Online (Sandbox Code Playgroud)

c++ arrays algorithm dynamic-programming multidimensional-array

3
推荐指数
1
解决办法
905
查看次数

类定义和内存分配

如果定义代表分配内存.为什么在实例化对象之前,C++中的类定义没有分配内存.

c++ class definition

2
推荐指数
2
解决办法
1万
查看次数

为什么不释放记忆不好的做法?

int a = 0; 
int *b = malloc (sizeof(int));
b = malloc (sizeof(int));
Run Code Online (Sandbox Code Playgroud)

上面的代码很糟糕,因为它在堆上分配内存然后不释放它,这意味着您将无法访问它.但是你也创建了'a'并且从未使用它,所以你也在堆栈上分配了内存,在范围结束之前不会释放内存.

那么为什么不在堆上释放内存,但是没有释放堆栈上的内存(直到作用域结束)是不好的做法?

注意:我知道堆栈上的内存无法释放,我想知道为什么它不被认为是坏的.

c memory

2
推荐指数
2
解决办法
515
查看次数