相关疑难解决方法(0)

我在哪里可以找到当前的C或C++标准文档?

对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.

谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.

要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:

  • C89
  • C99
  • C11
  • C++ 98
  • C++ 03
  • C++ 11
  • C++ 14

c c++ standards c++-faq

394
推荐指数
8
解决办法
12万
查看次数

为什么在C++中第二次调用析构函数是未定义的行为?

正如本回答中提到的,第二次简单地调用析构函数已经是未定义的行为12.4/14(3.8).

例如:

class Class {
public:
    ~Class() {}
};
// somewhere in code:
{
    Class* object = new Class();
    object->~Class();
    delete object; // UB because at this point the destructor call is attempted again
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,类的设计方式可以多次调用析构函数 - 不会发生双删除之类的事情.内存仍在delete调用的位置分配- 第一个析构函数调用不调用::operator delete()释放内存.

例如,在Visual C++ 9中,上面的代码看起来很有效.甚至UB的C++定义也没有直接禁止符合UB条件的东西.因此,对于上面的代码来说,需要打破一些实现和/或平台细节.

为什么上面的代码会在什么条件下中断呢?

c++ memory destructor memory-management undefined-behavior

16
推荐指数
4
解决办法
3257
查看次数

是否允许C++编译器发出编译同一程序的不同机器代码?

考虑一下情况.我们有一些特定的C++编译器,一组特定的编译器设置和一个特定的C++程序.

我们使用该编译器和那些设置编译特定程序两次,每次都进行"清理编译".

如果发出的机器代码是相同的(我不是指时间戳和其他花里胡哨,我的意思是只会执行真正的代码),还是允许从一个编辑到另一个编辑不同?

c++ compiler-construction compilation

7
推荐指数
1
解决办法
1171
查看次数

在同一环境中,同一程序的编译与同一编译器之间是否需要保持一致的未指定和未定义的行为?

让我们假装我的程序包含一个特定的构造,C++标准声明它是未指定的行为.这基本上意味着实现必须做一些合理的事情,但不允许记录它.但是,每次编译具有未指定行为的特定构造时是否需要生成相同的行为,或者是否允许在不同的编译中产生不同的行为?

未定义的行为怎么样?让我们根据标准假装我的程序包含一个UB结构.允许实现表现出任何行为.但是,同一编译器中相同程序的编译在同一环境中具有相同设置时,此行为是否会有所不同?换句话说,如果我在文件X.cpp中的第78行取消引用空指针,并且在这种情况下驱动器的实现格式是否意味着它将在重新编译程序后执行相同的操作?

问题是......我使用相同的编译器设置在相同的环境中使用相同的编译器编译相同的程序.构造声明是未指定的行为,未定义的行为会在每次编译时产生相同的行为,还是允许它们在编译之间有所不同?

c++ compiler-construction

0
推荐指数
1
解决办法
231
查看次数