有没有办法posix_memalign std :: vector而不先创建向量的本地实例?我遇到的问题是我需要告诉posix_memalign分配多少空间我不知道怎么说
sizeof(std::vector<type>(n))
Run Code Online (Sandbox Code Playgroud)
没有实际创建新的矢量.
谢谢
有没有人在一个大项目中使用了Andrei Alexandrescu的Modern C++ Design中的SmallObjectAllocator?我想实现这个分配器,但在我的项目中使用之前我需要一些关于它的意见.我做了一些测试,看起来非常快,但测试是在一个小的测试环境中进行的.我想知道它是多么快很多小物体(如事件,智能指针等),以及有多少额外的内存,它使用时.
如果我有以下声明:
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
我是一名试图学习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) 编译器在以下代码上抛出运行时段错误:
#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
考虑这个简单的例子:
#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)
是否有可能准确跟踪这些分配发生的位置(即哪个数据结构执行分配以及何时执行)?
小心翼翼,这可能不太好.根据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
考虑一下代码
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
从LukeH的答案到c#中列表<string>的最大数据限制是什么?
可以存储在List的当前实现中的最大元素数量理论上是Int32.MaxValue - 仅超过20亿.
我们看到一个List可以携带大量的物品.我假设编译器不仅T为每个新实现释放20亿倍大小的空间List<T>,那么列表如何动态增长?它是否有指向内存中不连续空格的指针?
我相信这已经被问了一百万次,但我找不到解释它的答案。有人告诉我永远不要这样做,但我还没有真正理解为什么。为什么这样的事情不算动态分配内存,为什么那么糟糕?
int a;
scanf("%d",&a);
int arr[a];
Run Code Online (Sandbox Code Playgroud)