在VS调试器中注意到内存地址通常是偶数后我尝试了以下程序(MS Visual Studio 2012)
struct noise {
int data[3];
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<noise*> vn;
std::vector<std::complex<double>*> vv;
for (int i(0); i < 90000; ++i) {
std::complex<double> *cur = new std::complex<double>(1, 1);
assert( ! ((int)cur&1) ); // assert if adress is not even
vv.push_back(cur);
if ( ! (i% (rand()%5 + 1)) ) vn.push_back(new noise);
}
for (std::size_t i(0), ie(vv.size()); i < ie; ++i) { delete vv[i]; }
for (std::size_t i(0), ie(vn.size()); i < ie; ++i) { delete vn[i]; …
Run Code Online (Sandbox Code Playgroud) 回答最近关于异常的问题,让我想起了一个旧的查询.
以下用c ++编译
#include <iostream>
using namespace std;
struct weird {
void danger()
{
throw *this;
}
};
int main()
{
weird object;
object.danger();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它总是会导致运行时错误.
堆栈展开期间是不是抛出了对象?
运行时错误闻起来像是一个调用terminate
,这是怎么引起的?
如果weird object
在封闭范围内声明(全局在这里)可以在内部范围内工作吗?(展开那个堆栈不会影响优质堆栈?)
以下代码在C++中编译
struct foo
{
int a, b;
};
struct foo foo()
{
struct foo a;
return a;
}
int main(void) {
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为它编译我然后继续尝试声明类型的对象foo
.有办法吗?似乎不可能做到:
foo a; // error: expected ‘;’ before ‘a’
foo a{}; // error: expected ‘;’ before ‘a’
foo a(); // most vexing parse would kick in any way
Run Code Online (Sandbox Code Playgroud)使用Visual Studio编译器进行编译时,是否可以更改模板实例化的深度?
我需要相当于gcc的
-ftemplate-depth = Num
Run Code Online (Sandbox Code Playgroud) 排序时,例如对的向量:
vector<pair<int, double>> v;
sort(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
您不需要指定排序标准以根据对的词典顺序进行排序,因为在未指定的情况下,应用词典比较.
对于元组也是类似的行为标准吗?
在VS2012中编译
vector<tuple<int, double, char>> tv;
sort(tv.begin(), tv.end());
Run Code Online (Sandbox Code Playgroud)
但这样做是否符合标准?
在C++中,您可以这样做:
struct A
{
int a, b;
double k = 3; // OK
};
Run Code Online (Sandbox Code Playgroud)
但不是这个
struct A
{
int a, b;
auto f = [this]() {return this->a + this->b; }; // Error
};
Run Code Online (Sandbox Code Playgroud)
编译器通知我们错误
非静态数据成员声明'auto'
让我们知道这会奏效
struct A
{
int a, b;
function<int(void)> f = [this]() { return this->a + this->b; }; // OK
};
Run Code Online (Sandbox Code Playgroud)
我想问一些有关这方面的见解.特别是为什么(简单的答案是标准明确不允许它根据某些经文)
换句话说:类成员初始化中是否包含足够的成员类型?
我知道在类成员初始化中是语法糖,但这是编译器可以收集附加信息的情况,但由于设计选择而无法这样做?(很像auto
C++ 11之前的缺乏)或更深层次选择设置的限制(如静态输入的语言等)?
看一下我的一些旧代码,我发现出于笨拙,我定义了一个像这样的析构函数:
~ResourceManager(void);
Run Code Online (Sandbox Code Playgroud)
这不仅可以编译,而且可以按预期工作.我当然改变了
~ResourceManager();
Run Code Online (Sandbox Code Playgroud)
但是我太快重构了吗?第一个版本是正确的还是好的C++风格?
由于问题已经结束,并且没有任何机会进行适当的消除歧义,因此我应该从解决这个问题的标准中提出相关的引用,当析构函数被放入透视图时
12.4析构函数
- 使用可选函数说明符(7.1.2)后跟〜后跟析构函数的类名后跟空参数列表的特殊声明符语法用于在类定义中声明析构函数.在这样的声明中,〜后跟析构函数的类名可以包含在可选的括号中; 这样的括号被忽略了.在析构函数声明的声明符中,不应将typedef-name用作〜之后的类名.
因此标准要求空参数列表.也许向后兼容自由函数的 C实践(f(void)
声明空参数列表的方式)在实现中将析构函数与它们一起使用,但它肯定似乎不是有效的C++.
这不包括由cornercase 这个(虽然有趣的信息在其中设置).我的代码如下所示:
struct concept {
virtual ~concept() = default;
};
struct policy {
protected :
~policy() = default;
};
struct implementation final : concept, policy {
};
Run Code Online (Sandbox Code Playgroud)
如果我只通过指针使用此层次结构concept
:
unique_ptr<concept> = make_unique<implementation>();
Run Code Online (Sandbox Code Playgroud)
以上安全吗?
我相信这是因为,如果有人试图通过指针删除policy
的protected
析构函数不会允许它(从招Modern C++ design
),但没有休息,做工精细?(即当删除指向概念的指针时,保证被正确调用的层次结构的析构函数?)
是否有类似于Weka或其他实用程序中实现的MetaCost算法的scikit-learn方法/类来执行const敏感分析?
通过查看VS中的内存泄漏检测机制,我想到了这个问题.那里需要以下样板代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Run Code Online (Sandbox Code Playgroud)
但用以下代码替换此代码DETECT_MLEAKS
:
#define DETECT_MLEAKS\
#define _CRTDBG_MAP_ALLOC\
#include <stdlib.h>\
#include <crtdbg.h>\
Run Code Online (Sandbox Code Playgroud)
无法做到.
有任何解决方法 - 建议?