标签: dynamic-memory-allocation

c 中的动态内存分配,释放在使用 malloc() 之前分配的部分内存

有什么方法可以释放您使用 malloc() 创建的部分内存吗?

认为:-

int *temp;

temp = ( int *) malloc ( 10 * sizeof(int));
free(temp);
Run Code Online (Sandbox Code Playgroud)

free() 将释放所有 20 字节的内存,但假设我只需要 10 字节。我可以释放最后 10 个字节吗?

c dynamic-memory-allocation

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

析构函数和delete() 哪个先出现?C++

该网站上的许多答案都提到delete()调用析构函数。但下面的示例代码似乎delete()在析构函数内部调用。当对象在堆栈和堆中初始化时,delete() 的正确用法是什么?

点击查看来源。

#include <iostream>
using namespace std;
 
class SmartPtr {
    int* ptr; // Actual pointer
public:
    // Constructor: Refer https:// www.geeksforgeeks.org/g-fact-93/
    // for use of explicit keyword
    explicit SmartPtr(int* p = NULL) { ptr = p; }
 
    // Destructor
    ~SmartPtr() { delete (ptr); }
 
    // Overloading dereferencing operator
    int& operator*() { return *ptr; }
};
 
int main()
{
    SmartPtr ptr(new int());
    *ptr = 20;
    cout << *ptr;
 
    // We don't need to call delete ptr: …
Run Code Online (Sandbox Code Playgroud)

c++ destructor new-operator dynamic-memory-allocation delete-operator

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

在 C++ 中使用 size_t sz 的附加参数重载运算符 delete

下面的代码允许您查看被删除的变量的大小:

#include <iostream>
#include <stdlib.h>
using namespace std;

struct P {
    static void operator delete(void* ptr, std::size_t sz)
    {
        cout << "custom delete for size " << sz <<endl;
        delete (ptr); // ::operator delete(ptr) can also be used
    }
    static void operator delete[](void* ptr, std::size_t sz)
    {
        cout << "custom delete for size " << sz <<endl;
        delete (ptr); // ::operator delete(ptr) can also be used
    }
};

int main()
{
    P* var1 = new P;
    delete var1;

    P* var2 …
Run Code Online (Sandbox Code Playgroud)

c++ overloading operator-overloading dynamic-memory-allocation

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

如何在C++中为char数组动态分配内存?

我正在学习C++中的动态内存.作为为任何数据类型动态分配和解除分配的标准方法,我学到的是,例如,

//For double,
double* pvalue1 = nullptr;
pvalue1 = new double;
*pvalue1 = 17.3;
delete pvalue1; //free up when I'm done
Run Code Online (Sandbox Code Playgroud)

但是,对于一个char数组,我了解到它的处理方式不同:

char* pvalue2 = nullptr;
pvalue2 = new char[6];
strncpy(pvalue2,"Hello",sizeof("Hello"));

std::cout << "Pointed-to value of pvalue2 is " << *pvalue2 << std::endl;
std::cout << "Value of pvalue2 is " << pvalue2 << std::endl;

delete [] pvalue2; //free up when I'm done
Run Code Online (Sandbox Code Playgroud)

然后,在命令提示符下:

Pointed-to value of pvalue2 is H
Value of pvalue2 is Hello
Run Code Online (Sandbox Code Playgroud)
  1. 为什么指针pvalue2给出"指向"字符串文字而不是内存地址?不是"指针值"总是它指向的内存地址吗?
  2. 为什么解除引用只给出数组中的第一个字符? …

c++ arrays pointers char dynamic-memory-allocation

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

在我的例子中需要帮助来理解malloc(0)

我试图理解双指针(这是指针持有另一个指针)的内部形成一个指针数组.所以,我试图运行以下代码,通过试验malloc进行调试,看看它是如何工作的.我无法理解malloc(0)我的情况,但我的代码通过输出"Hello World"来工作.

什么是差异

pToCharsPointers = (char**) malloc(0);
Run Code Online (Sandbox Code Playgroud)

pToCharsPointers = (char**) malloc(2 * sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

请有人澄清一下我的情况.

#include <stdio.h>

char **pToCharsPointers;

int main(void)
{
    pToCharsPointers = (char**) malloc(0);

    char* pToChars = "Hello";
    *pToCharsPointers = pToChars;

    *(pToCharsPointers + 1)= "World";

    printf("%s %s\n", *(pToCharsPointers + 0), *(pToCharsPointers + 1));

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

另外,如果有人能解释双指针如何与内存中的示例一起工作以进行可视化,我会非常感激,因为即使我试图在很多地方阅读此内容,我仍未能看到自己.

编辑:感谢大家分享您的答案,这真的有助于理解.当我打印它时,我得到了一个带有malloc(0)的有效指针,并且在多次尝试期间也可以解除引用它而没有问题.想了解它的工作原理.在我的情况下似乎未定义的行为实际上是预期的行为.

c memory malloc pointers dynamic-memory-allocation

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

malloc 是动态内存分配吗?

我被教官说叫p = (int*)malloc(5 * sizeof(int))不是动态内存分配,并且p=(int*)malloc(n * sizeof(int))是动态内存分配。

讲师正在谈论基本数据结构并教授数组。他曾告诉我们使用int arr[100]语法创建数组的传统方法,但随后他向我们介绍了 malloc。

据他说,由于内存大小不会改变,我猜它不是动态的。

从我可以从互联网上收集的信息来看,malloc在运行时分配内存,以及在运行时分配内存时的动态内存分配。所以我认为这两个malloc语句都是动态内存分配。我的推理有问题吗?

c malloc dynamic-memory-allocation language-lawyer

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

C++ - 字符串容量模式

我注意到 C++ 中的字符串容量遵循以下模式:

  • 初始字符串大小为 15
  • 对于大于特定大小“块”的任何字符串,容量将增加一倍。

以下是长度不超过 500 的字符串的字符串容量:

15
30
60
120
240
480
960
Run Code Online (Sandbox Code Playgroud)

使用以下 C++ 程序找到了容量:

#include <iostream>
#include <vector>

using namespace std;

string getstr(int len) { 
    string s = "";
    for (int i=0; i<len; i++) {
        s.append("1");
    }
    return s;
}

int main() {
    vector<int> capacities;
    int prevcap;
    for (int i=0; i<500; i++) {
        int cap = getstr(i).capacity();
        if (cap > prevcap) {
            capacities.push_back(cap);
            prevcap = cap;
        }
    }
    for (int i : capacities) {
        cout …
Run Code Online (Sandbox Code Playgroud)

c++ string dynamic-memory-allocation

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

合规的有状态分配器是否可以与其旧副本不同?

标准规定,在移动和重新绑定方面,分配器必须与其副本相同。但是,在调用其成员函数之后(例如分配值之后),它是否会变得与之前的状态不相等?也就是说,这可能是一个合规的分配器吗?

auto allocator_copy = allocator;
std::cout << (allocator == allocator_copy) << std::endl;  // Outputs "1", as prescribed by the standard.
allocator.allocate(1);
std::cout << (allocator == allocator_copy) << std::endl;  // Outputs "0";
Run Code Online (Sandbox Code Playgroud)

c++ allocator dynamic-memory-allocation c++11

5
推荐指数
0
解决办法
65
查看次数

为什么使用 `Span&lt;T&gt;` 比普通数组更昂贵?

我有一个非常复杂的数学算法,它已经在我的代码中存在多年了。今天,我做了一些高级性能测试,发现该算法占用了大量 CPU 时间。然后我看到(由于其年龄)该算法使用了double[] array = new double[6]几次,然后将数组传递给子函数。我认为使用Span<double>stackalloc double应该会稍微提高性能,因为它减少了 GC 负载并可能减少了一些范围检查。

令我非常惊讶的是,事实恰恰相反,这一变化导致整体测试时间从 23 秒提高到 28 秒。我编写了以下测试用例来展示该行为(实际代码要复杂得多)

        // This one must be quite big to see the timing difference for these simple test cases
        private const int MeasuremenLoopCount = 1000000;
        private const int ArraySize = 10;

        [Fact]
        public void UseArray()
        {
            for (int i = 0; i < MeasuremenLoopCount; i++)
            {
                double[] array = new double[ArraySize];
                array[0] = 2;

                CalcOnArray(array);
            }
        }

        private void CalcOnArray(double[] …
Run Code Online (Sandbox Code Playgroud)

c# optimization performance dynamic-memory-allocation

5
推荐指数
0
解决办法
963
查看次数

为什么 np.zeros() 比使用 Python 在 Numba 中重新初始化现有数组更快?

为什么numpy.zeros()比重新初始化现有数组更快?

我从事计算机建模工作,并在工作中使用 numba。有时需要有一个归零数组来累积某些操作的结果。一般来说,我认为对已分配的数组进行清零不会比创建一个充满零的新数组慢,但事实并非如此。我知道延迟选择(例如为什么Python的Numpy零和空函数之间的速度差异会随着较大的数组大小而消失?https: //vorpus.org/blog/why-does-calloc-exist/),但它必须采取是时候将其归零了。

据我所知,np.zeros使用calloc和所有加速都来自此调用,并且应该可以为其他语言重现。有什么保证吗,总是这样吗?这是好的做法还是不好的做法?

import numpy as np
import numba as nb
import benchit
nb.set_num_threads(1)

@nb.njit
def numba_operation(in_arr, out):
    for i in range(out.shape[0]):
        for j in range(out.shape[1]):
            out[i,j] += in_arr[i,j] * 2 + 4
            
@nb.njit
def numba_operation_with_zeros(in_arr, out):
    for i in range(out.shape[0]):
        for j in range(out.shape[1]):
            out[i,j] = 0
    for i in range(out.shape[0]):
        for j in range(out.shape[1]):
            out[i,j] += in_arr[i,j] * 2 + 4

    
def every_time_generate_zeros(data):
    in_arr, out = data
    out …
Run Code Online (Sandbox Code Playgroud)

python numpy calloc dynamic-memory-allocation numba

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