标签: dynamic-memory-allocation

posix_memalign for std :: vector

有没有办法posix_memalign std :: vector而不先创建向量的本地实例?我遇到的问题是我需要告诉posix_memalign分配多少空间我不知道怎么说

sizeof(std::vector<type>(n)) 
Run Code Online (Sandbox Code Playgroud)

没有实际创建新的矢量.

谢谢

c++ stl dynamic-memory-allocation

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

小对象分配器

有没有人在一个大项目中使用了Andrei Alexandrescu的Modern C++ Design中的SmallObjectAllocator?我想实现这个分配器,但在我的项目中使用之前我需要一些关于它的意见.我做了一些测试,看起来非常快,但测试是在一个小的测试环境中进行的.我想知道它是多么快很多小物体(如事件,智能指针等),以及有多少额外的内存,它使用时.

c++ memory-management dynamic-memory-allocation

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

C++ - 使用"new"在堆上分配内存

如果我有以下声明:

int *x = new int;

在这种情况下,我已动态地在堆上分配内存.换句话说,我现在有reserved一个int对象的内存地址.

在那之后说我做了以下:

delete x;

这意味着我freed up在堆上的内存地址.

在那之后说我再次做了以下事情:

int *x = new int;

x指向它指出,在堆旧的内存地址被删除之前?

如果我这样做过delete:

x = NULL;

然后,这样做:

int *x = new int;

x指向堆上AA内存地址较旧的?

谢谢.

c++ heap new-operator memory-address dynamic-memory-allocation

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

RAII,unique_ptr和out参数

我是一名试图学习C++ 11的C#开发人员.我正在尝试使用windns.h查询DNS.

我开始DnsQuery()并阅读,我需要释放结果记录输出参数DnsRecordListFree().C#方式可能是使用try-finally块来确保我释放资源,无论如何.

但是我了解到没有finally阻塞,并且windns.h真的应该与时俱进并实现符合RAII标准的接口(据我理解的典型建议).我试图创建一个RAII包装器类,而不是等待它发生,我试图使用析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针.

但我对如何正确使用此句柄或指针获取out参数感到困惑.在我研究的过程中,我学会了如何unique_ptr(我已经学过一些东西)可以与自定义删除器一起使用.

所以这是我迄今为止的简单代码.可能更多的错误不仅仅是这个,但我想我可以声明另一个PDNS_RECORD *presult并使用它作为out参数然后复制或移动或以其他方式将其值分配给a unique_ptr,但这听起来像是太多的工作/混乱.

在我看来,unique_ptr内部指针应该初始化为NULL,我应该能够以某种方式将指针的地址传递给out参数,这DNSQuery将更新原始值,当unique_ptr我的函数中的范围超出范围时,DnsRecordListFree()调用将自动制作.我不知道为了最小的正确/安全使用找出正确的组合.

#include <iostream>
#include <fstream>
#include <memory>
#include <Windows.h>
#include <WinDNS.h>

using namespace std;

auto pdnsDeleter = [&](PDNS_RECORD *ptr){ if (ptr) DnsRecordListFree(ptr); };

int main(int argc, char **argv)
{
    cout << "Hello World\n";

    std::unique_ptr<PDNS_RECORD*, decltype(pdnsDeleter)> results(0, pdnsDeleter);

    if (DnsQuery(L"google.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, ??results??, NULL))
    {
        cout << …
Run Code Online (Sandbox Code Playgroud)

c++ winapi out-parameters dynamic-memory-allocation

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

包含字符串值的struct在使用动态内存分配创建后,在分配时会导致分段错误

编译器在以下代码上抛出运行时段错误:

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

struct Node{
  int data;
  void *next;   
  string nodeType;
};

Node* initNode(int data){
  Node *n = (Node*)malloc(sizeof(Node));
  n->data = data;
  n->next = NULL;
  n->nodeType = "Node";   //if this line is commented it works else segfault
  return n;
}

int main() {
  Node *n1 = initNode(10);
  cout << n1->data << endl;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么字符串赋值在动态分配的结构中不起作用,在静态分配的情况下,为什么它有效?

它的工作方式如下:

Node initNode(string data){
  Node n;
  n.data = data;  //This works for node creation statically
  n.next = NULL;
  n.nodeType = "Node"; …
Run Code Online (Sandbox Code Playgroud)

c++ string struct memory-management dynamic-memory-allocation

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

如何跟踪C++标准库调用的内存分配?

考虑这个简单的例子:

#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
#include <iterator>
int main()
{
    std::list<int> l(10);
    std::iota(l.begin(),l.end(),77);

    std::vector<std::list<int>::iterator> v(l.size());
    std::iota(v.begin(), v.end(), l.begin());

    std::vector<int> dest;
    std::copy_if(l.begin(), l.end(), std::back_inserter(dest), [](int i){return i%2==1;});

    for(auto n : dest)
        std::cout << n << " ";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Valgrind下运行时,它给出了以下输出:

==27353==   total heap usage: 15 allocs, 15 frees, 380 bytes allocated
Run Code Online (Sandbox Code Playgroud)

是否有可能准确跟踪这些分配发生的位置(即哪个数据结构执行分配以及何时执行)?

c++ memory-management stl dynamic-memory-allocation

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

是否可以删除未使用新表达式构造的对象?

小心翼翼,这可能不太好.根据cppref:

如果expression是其他任何东西,包括它是否是由new-expression的数组形式获得的指针,则行为是未定义的.

把它放在一边,实际上是下面的代码OK(T非数组,假设new没有替换)?

auto p = (T*)operator new(sizeof(T));
new(p) T{};
delete p;
Run Code Online (Sandbox Code Playgroud)

据说在cppref

当调用分配功能,新的表达通过请求作为第一个参数,类型的字节数 std::size_t,而这正是sizeof(T)对于非数组T.

所以我想这可能还行.但是,据说从C++ 14开始,

允许新表达式忽略或组合通过可替换分配函数进行的分配.在省略的情况下,存储器可以由编译器提供而不需要调用分配函数(这也允许优化掉未使用的new-expression).在组合的情况下,如果满足以下所有条件,则可以扩展由新表达式E1进行的分配以为另一个新表达式E2提供额外的存储:[...]

请注意,只有在使用new-expression时才允许此优化,而不是任何其他方法来调用可替换的分配函数: delete[] new int[10];可以优化,但operator delete(operator new(10));不能.

我不太确定其含义.那么,这在C++ 14中可以吗?

我为什么问这个问题?(来源)

有时,内存分配和初始化无法在一个步骤中完成.您必须手动分配内存,执行其他操作,然后初始化对象,例如,以提供强大的异常安全性.在这种情况下,如果删除表达式无法在结果指针上使用,则必须手动取消初始化和取消分配,这很乏味.更糟糕的是,如果使用新表达式和手动方法,则必须跟踪每个对象使用哪一个.

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

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

在新表达式中进行内存分配后是否对初始化程序进

考虑一下代码

auto p = new T( U(std::move(v)) );
Run Code Online (Sandbox Code Playgroud)

然后是初始化器U(std::move(v)).让我们假设T( U(std::move(v)) )不抛出.如果在底层内存分配之后评估初始化程序,则代码是强异常安全的.否则,事实并非如此.如果抛出内存分配,v就已经被移动了.因此,我对内存分配和初始化程序评估之间的相对顺序感兴趣.它是定义的,未指定的,还是什么?

c++ exception new-operator dynamic-memory-allocation object-initialization

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

C#如何为List <T>动态分配内存?

LukeH的答案到c#中列表<string>的最大数据限制是什么?

可以存储在List的当前实现中的最大元素数量理论上是Int32.MaxValue - 仅超过20亿.

我们看到一个List可以携带大量的物品.我假设编译器不仅T为每个新实现释放20亿倍大小的空间List<T>,那么列表如何动态增长?它是否有指向内存中不连续空格的指针?

.net c# memory list dynamic-memory-allocation

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

使用 [] 运算符而不是使用 malloc 动态分配数组?

我相信这已经被问了一百万次,但我找不到解释它的答案。有人告诉我永远不要这样做,但我还没有真正理解为什么。为什么这样的事情不算动态分配内存,为什么那么糟糕?

int a;
scanf("%d",&a);
int arr[a];
Run Code Online (Sandbox Code Playgroud)

c dynamic-memory-allocation

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