我知道根据C++标准,如果新的无法分配内存,它应该抛出std :: bad_alloc异常.但我听说有些编译器如VC6(或CRT实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查NULL会使代码看起来非常难看.
我想知道CLR和CLI之间究竟有什么区别?从我到目前为止所阅读的内容来看,它似乎表明CLI是CLR的一个子集.但是CLR中的所有内容都不是强制性的吗?CLR究竟可以省略什么来创建CLI?
我对std :: remove算法的使用之间的区别感到有点困惑.具体来说,我无法理解使用此算法时要删除的内容.我写了一个像这样的小测试代码:
std::vector<int> a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
std::vector<int>::iterator iter = a.begin();
std::vector<int>::iterator endIter = a.end();
std::cout<<"Using iter...\n";
for(; iter != endIter; ++iter)
{
std::cout<<*iter<<"\n";
}
std::cout<<"Using size...\n";
for(int i = 0; i < a.size(); ++i)
{
std::cout<<a[i]<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
两种情况下的输出均为2,2.
但是,如果我使用erase删除这样的东西:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
Run Code Online (Sandbox Code Playgroud)
我得到输出为2.
所以我的问题是:
(1).有没有使用std :: remove而不是使用擦除功能.
(2).即使在执行std :: remove之后,为什么a.size()返回2而不是1?
我在Scott Meyer的Effective STL书中读到了关于擦除删除习语的内容.但我仍然有这种困惑.
C/C++中联合的大小是多少?它是最大数据类型的sizeof吗?如果是这样,如果联合的较小数据类型之一处于活动状态,编译器如何计算如何移动堆栈指针?
我有一个组合框,我在其中显示一些条目,如:
Equals
Not Equals
Less Than
Greater Than
Run Code Online (Sandbox Code Playgroud)
请注意,这些字符串包含空格.我有一个定义的枚举,它匹配这些条目,如:
enum Operation{Equals, Not_Equals, Less_Than, Greater_Than};
Run Code Online (Sandbox Code Playgroud)
由于不允许空间,我使用了_字符.
现在,有没有办法将给定的字符串自动转换为枚举元素而无需在C#中编写循环或一组if条件?
我正在检查dynamic_cast的行为,发现当它失败时,仅当目标是引用类型时才抛出std :: bad_cast异常.如果目标是指针类型,则不会从强制转换中抛出异常.这是我的示例代码:
class A
{
public:
virtual ~A()
{
}
};
class B : public A
{
};
int main()
{
A* p = new A;
//Using reference
try
{
B& b = dynamic_cast<B&>(*p);
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
//Using pointer
try
{
B* pB = dynamic_cast<B*>(p);
if( pB == NULL)
{
std::cout<<"NULL Pointer\n";
}
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是"Caught bad cast"和"NULL pointer".代码使用VS2008编译.这是正确的行为吗?如果是,那为什么会有区别?
C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?
以前,我曾经使用MFC的集合类CArray和CMap.过了一会儿,我换了STL容器,并且已经使用了一段时间.虽然我发现STL要好得多,但我无法明确指出它的确切原因.一些推理如:
我可以提出的唯一原因是我可以在容器上使用算法.我在这里缺少任何其他原因 - 是什么让STL容器比MFC容器更好?
我有一个用C++编写的循环,它是为一个大整数数组的每个元素执行的.在循环内部,我屏蔽了整数的一些位,然后找到最小值和最大值.我听说如果我使用SSE指令进行这些操作,它将比使用按位AND和if-else条件写入的普通循环运行得快得多.我的问题是我应该参加这些SSE指令吗?此外,如果我的代码在不同的处理器上运行会发生什么?它仍然可以工作或这些指令是特定于处理器的吗?
我试图回答这个问题.正如接受的答案所暗示的那样,该代码的问题在于并非所有控制路径都返回一个值.我在VC9编译器上尝试了这个代码,它给了我一个相同的警告.我的问题是为什么只是一个警告而不是错误?此外,如果没有返回值的路径被执行,该函数将返回什么(它必须返回一些东西)?它只是堆栈顶部的任何东西还是可怕的未定义行为?
c++ ×8
stl ×2
.net ×1
assembly ×1
c ×1
c# ×1
casting ×1
clr ×1
containers ×1
dynamic-cast ×1
enums ×1
mfc ×1
new-operator ×1
optimization ×1
processor ×1
scope ×1
sizeof ×1
sse ×1
unions ×1
visual-c++ ×1
visual-c++-6 ×1