小编Nav*_*een的帖子

在任何情况下new都会返回NULL吗?

我知道根据C++标准,如果新的无法分配内存,它应该抛出std :: bad_alloc异常.但我听说有些编译器如VC6(或CRT实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查NULL会使代码看起来非常难看.

c++ memory-management visual-c++-6 new-operator visual-c++

52
推荐指数
3
解决办法
4万
查看次数

CLR和CLI - 有什么区别?

我想知道CLR和CLI之间究竟有什么区别?从我到目前为止所阅读的内容来看,它似乎表明CLI是CLR的一个子集.但是CLR中的所有内容都不是强制性的吗?CLR究竟可以省略什么来创建CLI?

.net clr command-line-interface

49
推荐指数
3
解决办法
3万
查看次数

擦除和删除之间的区别

我对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++ stl

47
推荐指数
6
解决办法
4万
查看次数

C/C++中的联合大小

C/C++中联合的大小是多少?它是最大数据类型的sizeof吗?如果是这样,如果联合的较小数据类型之一处于活动状态,编译器如何计算如何移动堆栈指针?

c c++ sizeof unions

41
推荐指数
4
解决办法
6万
查看次数

C#中枚举转换的字符串

我有一个组合框,我在其中显示一些条目,如:

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条件?

c# enums

39
推荐指数
4
解决办法
5万
查看次数

使用带有引用和指针的dynamic_cast时的行为差异

我正在检查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++ dynamic-cast casting

39
推荐指数
4
解决办法
3万
查看次数

C++中异常对象的范围

C++中异常对象的范围是什么?一旦执行catch处理程序,它是否会超出范围?另外,如果我创建一个未命名的异常对象并抛出它,那么在捕获该异常时,如果我通过const引用或非const引用捕获它是否重要?

c++ scope exception-handling

39
推荐指数
2
解决办法
8340
查看次数

为什么STL容器比MFC容器更受欢迎?

以前,我曾经使用MFC的集合类CArrayCMap.过了一会儿,我换了STL容器,并且已经使用了一段时间.虽然我发现STL要好得多,但我无法明确指出它的确切原因.一些推理如:

  1. 它需要MFC:不成立,因为我的程序的其他部分使用MFC
  2. 它是平台相关的:不成立,因为我只在Windows上运行我的应用程序.(不需要可移植性)
  3. 它在C++标准中定义:好的,但MFC容器仍然有效

我可以提出的唯一原因是我可以在容器上使用算法.我在这里缺少任何其他原因 - 是什么让STL容器比MFC容器更好

c++ mfc containers stl

30
推荐指数
7
解决办法
7535
查看次数

使用SSE指令

我有一个用C++编写的循环,它是为一个大整数数组的每个元素执行的.在循环内部,我屏蔽了整数的一些位,然后找到最小值和最大值.我听说如果我使用SSE指令进行这些操作,它将比使用按位AND和if-else条件写入的普通循环运行得快得多.我的问题是我应该参加这些SSE指令吗?此外,如果我的代码在不同的处理器上运行会发生什么?它仍然可以工作或这些指令是特定于处理器的吗?

c++ optimization assembly sse processor

28
推荐指数
5
解决办法
3万
查看次数

为什么"并非所有控制路径都返回值"是警告而不是错误?

我试图回答这个问题.正如接受的答案所暗示的那样,该代码的问题在于并非所有控制路径都返回一个值.我在VC9编译器上尝试了这个代码,它给了我一个相同的警告.我的问题是为什么只是一个警告而不是错误?此外,如果没有返回值的路径被执行,该函数将返回什么(它必须返回一些东西)?它只是堆栈顶部的任何东西还是可怕的未定义行为?

c++ compiler-warnings

28
推荐指数
3
解决办法
1万
查看次数