鉴于可用性make_unique
和make_shared
自动删除unique_ptr
以及shared_ptr
析构函数,在C++ 14中使用new
和使用的情况(除了支持遗留代码之外)是delete
什么?
我很清楚地知道,在C++中,什么delete[]
是对new[]
,delete
是new
.这与C++语法无关.我想知道原因 delete[]
被定义为与平原不同的东西delete
.这有什么实施原因?
考虑一下这段代码会发生什么:
MyClass *object = new MyClass;
delete object;
Run Code Online (Sandbox Code Playgroud)
当delete
遇到存储器管理器具有查找在其分配结构,不管它是对象指针值,并标记对应sizeof(MyClass)
的存储器作为自由块.
现在考虑一下这段代码会发生什么:
MyClass *array = new MyClass[ num_objects ];
delete [] array;
Run Code Online (Sandbox Code Playgroud)
当delete
遇到存储器管理器具有查找在其分配结构数组指针值,不管它是,发现num_objects
从该结构值,并标记对应num_objects*sizeof(MyClass)
的存储器作为自由块.
除了num_objects
在单个对象案例中假设1并且在数组情况下查找内部数据结构之外,我没有看到差异.那么,为什么delete
并delete[]
不能一直拼写相同?
换句话说,出了什么问题
MyClass *object = new MyClass;
Run Code Online (Sandbox Code Playgroud)
被实施为
MyClass *object = new MyClass[1];
Run Code Online (Sandbox Code Playgroud)
让C++的语法就不会做出区分delete
和delete[]
?
有解释语言,如Lisp,Tcl,Perl等,可以很容易地在运行时在代码中定义lambda/proc/sub,并在同一个会话中对其进行评估.
存在编译语言,例如C++,其执行速度比解释的语言快得多,但是在运行时期间在编译程序中定义函数并执行它并不容易,如果可能的话.
这里的问题是执行以下操作:
在运行时定义函数:例如,基于初始输入数据导出数据的分析模型.
在循环中快速执行上述功能:例如,应用派生的分析模型来分析传入的数据.
我看到的一个解决方案不是很漂亮:
基于初始输入数据,在嵌入式Tcl中导出表示分析模型的过程.
通过评估Tcl中的一个样本点阵列的过程创建了一个查找表,从乐观的角度来说,这将覆盖适用范围.
查找表从Tcl解释器传递回二进制文件(用C++开发).
然后通过在查找表中"足够接近"值之间进行插值来分析输入数据.
上述解决方案有效,但在概念和计算方面都存在很多问题.因此,问题是:是否可以在C++中定义一个函数并使其可以在同一个运行时会话中执行?
从概念上讲,是否有可能做一些事情,比如将函数创建为字符串,在内存中编译它,并以某种方式将其链接回正在执行的二进制文件中?
这是Eigen文档的一部分:
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
Run Code Online (Sandbox Code Playgroud)
输出:
1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
我无法理解如何通过operator <<上面捕获所有逗号分隔值.我做了一个小小的实验:
cout << "Just commas: ";
cout << 1, 2, 3, 4, 5;
cout << endl;
cout << "Commas in parentheses: ";
cout << ( 1, 2, 3, 4, 5 );
cout << endl;
Run Code Online (Sandbox Code Playgroud)
可以预测(根据我对C++语法的理解)只有一个值被operator <<捕获:
Just commas: 1
Commas in parentheses: 5
Run Code Online (Sandbox Code Playgroud)
因此标题问题.
我想使用整数模板参数为模板类定义一个函数,以便函数参数的数量取决于模板参数.这是一个例子:
template< class Coord, int dim >
class Point {
Coord mCoords[ dim ];
public:
void Set( /* I want exactly dim Coord arguments here. */ );
};
Run Code Online (Sandbox Code Playgroud)
我想要编译这段代码:
Point<double,2> pt2d;
pt2d.Set( 25, 32 );
Point<double,3> pt3d;
pt3d.Set( 25, 32, 100 );
Run Code Online (Sandbox Code Playgroud)
并且此代码失败:
Point<double,2> pt2d;
pt2d.Set( 25, 32, 100 ); // Too many arguments
Point<double,3> pt3d;
pt3d.Set( 25, 32 ); // Too few arguments
Run Code Online (Sandbox Code Playgroud)
现在,我可以手动专注Point
于较小的维度以具有不相关的Set
功能,但我发现基本上重复相同的代码un-C++的做法 - ish.此外,我不应该专门针对int模板参数的每个可能值.
有没有可能实现的Point<Coord,dim>::Set()
函数可以采用完全dim
类型的参数而Coord
无需为每个值编写特化代码dim
?
我float
从多个线程计算s并将结果存储在非重叠范围内,vector<float>
如下所示:
在运行我预先分配它的任何线程之前vector::reserve
.
在每个线程中vector
,计算特定于线程的结果,然后将其复制到目标容器中,如下所示:
vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy( localVector.begin(), localVector.end(), destination );
Run Code Online (Sandbox Code Playgroud)
这是安全的做法吗?
是否可以在Linux上用C++创建系统范围的全局变量/信号量/互斥量?
原因如下:我有一个系统经常在不相关的数据上运行同一软件的多个副本.通常有4个作业,每个作业运行相同的软件.该软件有一个小部分,它创建一个占用大量内存的巨大图形; 在该部分以外的内存使用量适中.
有时会发生这样的情况,即2个作业同时遇到同样占用大量内存的部分,整个系统开始交换.因此,我们希望通过在不同作业之间创建类似于临界区互斥体的东西来防止这种情况,这样一次就不会有多个内存分配大量内存.
如果这些是相同工作的线程,pthread锁将完成这项工作.
在不同的工作之间实现这种互斥量的好方法是什么?
这是对这个问题的后续跟进.OP问题中的代码看起来非常合理且对我来说毫不含糊.为什么C++不允许使用以前的参数来定义后面的参数的默认值,如下所示:
int foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)
此外,至少在C++ 11中,声明的参数类型可用于确定返回类型,因此以类似的方式使用函数参数并非闻所未闻:
auto bar( int a ) -> decltype( a );
Run Code Online (Sandbox Code Playgroud)
因此,问题是:为什么foo
不允许上述声明的原因是什么?
例如,Area()
在这里打电话是否安全:
Polygon::Polygon( Coord x0, Coord y0, Coord x1, Coord y1 )
: m_BoundingBox( x0, y0, x1, y1 ), m_Area( m_BoundingBox.Area() )
{
}
Run Code Online (Sandbox Code Playgroud)
也就是说,可以假设: ,
构造函数部分中的成员按照列出的顺序构造和初始化吗?
c++ ×9
c++11 ×1
c++14 ×1
concurrency ×1
constructor ×1
eigen ×1
interpreter ×1
lambda ×1
linker ×1
linux ×1
mutex ×1
new-operator ×1
semaphore ×1
stl ×1
templates ×1