标签: dynamic-memory-allocation

realloc() 没有赋值问题

我的一个同学给我发了一个代码,问我怎么了。它是这样的:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *d_array, number, divisor_count, i, size = 1;
    char answer;

    d_array = (int*) malloc(size * sizeof(int));

    do
    {
        printf("\nEnter a number:  ");
        scanf("%d", &number);
        divisor_count = 0;
        for(i = 2; i < number; i++)
            if (number % i == 0) divisor_count++;
        if(divisor_count == 0)
        {
            realloc(d_array,(size + 1) * sizeof(int));
            d_array[size - 1] = number;
            size++;
        }
        printf("\nIs there another number? y/n ");
        getchar();
        answer = getchar();
    } while (answer == 'y'); …
Run Code Online (Sandbox Code Playgroud)

c realloc dynamic-memory-allocation

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

访问动态分配数组的越界元素/无 SegFault

我正在用 C 语言开发一个程序,它使用链表数组(原始哈希表)作为数据类型来表示某些日期信息。该数组有十二个元素对应于一年中的几个月,每个月都有一个包含数据节点的链表。

我开发了使用这种数据类型的模块,它运行良好。后来我发现我正在访问越界的数组元素(例如通过索引 12 而不是 11 访问第 12 个元素)。但该程序始终如一地运行,没有发生任何事故。我从未收到过分段错误。我已经纠正了编码错误。有人能解释为什么访问越界元素不会导致段错误吗?

这已经不是第一次发生了。我创建了一个动态分配的多维数组,为了测试,我尝试访问越界元素。该程序运行良好,产生了准确的结果,并且在大多数情况下不会出现段错误。我唯一一次实现了,我不得不尝试访问实质上越界的元素。

(这些程序目前是用于测试的 Windows 控制台应用程序。我正在使用 MinGW 进行编译。如果有帮助,我可以包含代码。)

c memory-management dynamic-memory-allocation

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

.net List&lt;T&gt; 修剪多余

考虑这种情况:Form1 构建了一个包含大量元素的 List 对象。然后,它必须通过参数将此集合传递给 Form2。

在 Form2 中制作它的硬拷贝后,我想清除与 Form1 中的集合相关的所有内容。让Col1成为 Form1 中集合的标识符。

由于 Col1 是通过参数通过引用传递的,因此我调用Col1.Clear()来清除它的元素,然后调用 Col1.TrimExcess()将其实际大小减少到 0,因此它不会跟踪大量值。

我的目的是尽快清除所有使用过的内存。Col1.TrimExcess() 应该清除所有使用的内存,但我很好奇 Col1 = null 在我(或大多数)情况下是否会更好?

c# collections garbage-collection dynamic-memory-allocation

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

在内部构造函数中,使用/ catch块将简单的内存分配到公共​​原始指针中?

我有一个带有原始指针的情况,我无法更改为智能指针,因为它是接口的一部分(我不想破坏使用它的任何代码):

struct Foo
{
  Foo();
  ~Foo();

  int * m_pStuff; // public!
};
Run Code Online (Sandbox Code Playgroud)

我不想在我的病人身上做太多事情.就像这样:

m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
Run Code Online (Sandbox Code Playgroud)

然后在析构函数中删除它.

现在,我想知道使用try/catch是否值得围绕它:

Foo::Foo()
  : m_pStuff(0)
{
  try
  {
    m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
    m_pStuff[0] = 0;
  } 
  catch(...)
  {
    delete m_pStuff;
    throw;
  }
}
Run Code Online (Sandbox Code Playgroud)

我能看到的观点:

  • 更复杂的代码
  • 并不是真的希望在那里发生任何异常(除非分配时空间不足)
  • 并不是真的希望代码能够改变

我能看到的要点:

  • 向潜在的未来编码者表明,他们应该小心处理任何抛出异常并将其放入已经存在的try块中
  • 如果发生任何异常,则会释放内存释放

我还是很犹豫:我是否应该尝试使用try/catch?为什么?我想就此提出你的意见.

此外,您是否看到在分配时由于内存不足而导致异常的可能性?在这种情况下,已经分配的内存将被自动回收,对吗?

谢谢!

c++ constructor pointers exception dynamic-memory-allocation

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

动态分配内存中free()的范围是什么?

假设我有以下代码:

typedef struct {
  int numBars;
  BarType *bars;
} fooType;

foo = (fooType *) malloc(sizeof(fooType));
foo->bars = (BarType *) malloc(sizeof(barType));
Run Code Online (Sandbox Code Playgroud)

调用free(foo)也会释放条形码或者我需要这样做:

free(foo->bars);
free(foo);
Run Code Online (Sandbox Code Playgroud)

直观地说,我觉得调用free(富)应该是足够了 - 如果我不需要调用free(foo-> numBars)我不应该需要调用free(foo->条).但是我没有为numBars手动分配内存,而是为了吧.

c malloc free dynamic-memory-allocation dynamic-allocation

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

C - 比较不同分配的指针?

我在C中实现了一个AVL树.后来我才读到指针比较仅在同一个数组中的对象之间有效.在我的实现中,我做了一些相等的测试.例如,要测试节点是否是我可能测试的父节点的右子节点node==node->parent->right.但是,节点是根据需要分配的,而不是在连续的块中.是否定义了此行为?如果不是,你会如何编写这段代码呢?

c pointers avl-tree dynamic-memory-allocation

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

malloc 接触未分配的内存

我想知道为什么我的分配有效。我创建了ptr哪个是一个指针,ptr2哪个是与ptr.

这是我的代码:

int* ptr = malloc(sizeof(int));
int* ptr2 = ptr;
*ptr2 = 1;
ptr2 = ptr+1;
*ptr2 = 2;
Run Code Online (Sandbox Code Playgroud)

最后,我有一个由两个整数组成的数组:

ptr[0] = 1
ptr[1] = 2
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么我可以在ptr2没有错误或警告的情况下影响值 2 ?我只malloc()为数组中的一个整数位置设置了 -ed,不是吗?

c arrays malloc memory-management dynamic-memory-allocation

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

puts()如何在没有\ 0终止符的情况下找到数组的结尾?

在这段代码中:

int length = atoi(argv[1]);
char *tab = malloc(length * sizeof(char));
memset(tab, '-', length);
puts(tab);
Run Code Online (Sandbox Code Playgroud)

无论我传递什么价值argv[1],输出都是正确的.例如,argv[1] = "5"我得到-----(五个连字符).

我想知道puts()当我没有在我的数组的末尾放置'\ 0'时如何找到输入字符串的结尾char.

c arrays string memory-management dynamic-memory-allocation

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

为什么我必须动态地为QLabel分配内存才能工作?

此代码不动态分配内存,不会在窗口上显示任何标签.

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QLabel l;
    l.setText ("cdsadsaf");
    l.setParent (this);
}
Run Code Online (Sandbox Code Playgroud)

动态分配内存后,标签会显示出来.

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QLabel *label = new QLabel(this);
    label->setText("first line\nsecond line");
}
Run Code Online (Sandbox Code Playgroud)

为什么QLabel必须使用动态内存分配?

c++ qt dynamic-memory-allocation qlabel

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

在动态内存分配后将整数传递给构造函数

在下面的类中,承包商应该从main函数中获取一个字符串和int("Jan",24).但是当传递整数时,似乎有一些错误,因为另一个随机整数(如1)会被打印为年龄.

    #include <iostream>
    #include <string>
    using namespace std;

    class Human{
    private:
        string *name;
        int *age;
    public:
        Human(string iname, int iage){
            name = new string;
            age = new int;

            name = &iname;
            age = &iage;
        }

        void display(){
            cout << "Hi I am "<<*name<<" and i am "<<*age<<" years old"<<endl;}

        ~Human(){
            delete name;
           delete age;
           cout << "all memories are released"<<endl;
       }
    };

    int main()
    {
        Human *Jan = new Human("Jan",24);
        Jan->display();
        delete Jan;

       return 0;
     }
Run Code Online (Sandbox Code Playgroud)

输出如下,打印年龄而不是24岁.任何想法为什么?

    Hi I am …
Run Code Online (Sandbox Code Playgroud)

c++ destructor pass-by-reference dynamic-memory-allocation

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