相关疑难解决方法(0)

RAII和堆栈展开

TIL,我对RAII和堆栈展开的'交织'(缺乏一个更好的词)的概念是完全(如果不是完全)错误.我的理解是使用RAII,防止任何/所有资源泄漏 - 甚至是可能由未处理的异常引起的泄漏.

然而,编写这个测试程序并随后磕磕绊绊地阅读本文/文档,让我意识到堆栈展开只会导致启用RAII的资源释放为try块中的自动启动,而不是自动在例如外部/其他范围内.

我对这个(新的)理解是否正确?或者还有其他细微差别我尚未掌握?那里的任何大师都想要进入?任何好的写作/分析/解释(堆栈展开)的指针都会有所帮助/赞赏......

c++ exception-handling exception raii stack-unwinding

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

这是否会导致引用超出范围后指向任何内容?

以下代码是否安全?

class B {
  public:
    int& b;
    B (int& _b) :
      b(_b) {}
};

B* foo() {
  int a;
  return new B(a);
}
Run Code Online (Sandbox Code Playgroud)

foo返回的对象中的引用是否会指向任何内容(因为int a超出范围)或编译是否计算出来?

c++ constructor scope reference

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

如何调用这种操作"a = x"或"a ++"等?

如何编写编译器的人称之为?我知道这int a, b, c;叫做表达.但是这样的事情:int a = 2?或者a++,a=c等我没有任何想法.我在哪里可以找到这些条款?C标准还是买一本关于编译器构造的书?我希望这很清楚.提前致谢.

c compiler-construction

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

C++ list.erase(it,it)是否会删除某些内容?哪里可以找到好的参考?

我的意思是在迭代器指向同一元素的情况下.

http://www.cplusplus.com/reference/stl/list/erase/上说"从列表容器中删除单个元素(位置)或一系列元素([first,last))." 并且"首先,最后一个迭代器指定要删除的列表容器中的范围:[first,last].即,范围包括first和last之间的所有元素,包括first指向的元素而不是last指向的元素. "

我完全不知道我是否做错了什么,但是对于我的代码的每一部分,我都没有在任何地方找到所需的信息,当我想自己测试时,我结束了某种情况,当我不知道发生了什么时在问这里并长时间争吵之后,我发现了类似"未定义的行为"的东西.那么有人可以更快地帮助我,现在是什么?

而且我想成为更好的程序员并找到比cplusplus.com和cppreference.com更好的资源,因为他们都很糟糕,还有更好的东西吗?我每天都使用这个C++变得更疯狂(但我仍然认为它对于快速的大型程序比Java或C更好),请帮忙.

c++ list erase web

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

std :: vector :: erase使用相等的参数

调用迭代方法是否安全,例如STL容器擦除(覆盖2个迭代器),例如在我的情况下std::vector::erase(),两个参数都是vec.end()?我做了一个实验,看起来调用什么也没做,但我想确保我可以在代码中安全地使用它,否则我必须测试我的迭代器并避免erase()它们是相等的.

c++ stl

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

在c中打印指针中的指针差异

考虑一下代码:

int main() {
    char orange[5];
    for (int i = 0; i < 5; i++)
        orange[i] = 1;
    printf("orange: %d\n", *((char *)orange));        
    printf("orange: %d\n", *((int *)orange)); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一个print语句给了我一个值1,但是第二个print语句给了我一个值16843009.差异的原因是什么?

c pointers casting

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

如何在C中使用printf("%sd",x)而不是printf("%5d",x).这里s = 5

所以我真的希望这一切发生.我有一个整数变量,我想使用该变量在我的printf函数中给出间距,但C不允许我这样做,是否有任何解决方法.

#include<stdio.h>
int main(void){
   int s = 5;
   printf("%sd",s);
}
Run Code Online (Sandbox Code Playgroud)

非常感谢提前!

c format

0
推荐指数
2
解决办法
266
查看次数

对C++中运算符优先级的困惑

比如说,在下面的测试表达式中:

int ggg9 = fggg2() + (fggg3() && fggg4() < fggg5() * fggg6());
//                 4          11         6         3
Run Code Online (Sandbox Code Playgroud)

如果我们遵循运算符优先级(在表达式下面的注释行中显示),我会假设首先计算parens中的表达式,然后将结果添加到fggg2().

因此,我假设它将按此顺序解决:

int r1 = fggg5() * fggg6(); //Precedence 3 (inside parens)
int r2 = fggg4() < r1;      //Precedence 6 (inside parens)
int r3 = fggg3() && r2;     //Precedence 11 (inside parens)
int ggg9 = fggg2() + r3;    //Outside of parens, so it's last
Run Code Online (Sandbox Code Playgroud)

但是x86-64 gcc 8.2 解决它是这样的:

在此输入图像描述

(我将它转换回C++)

    int i0;
    int r2 = fggg2();
    int …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-precedence visual-studio-2017

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

指针是否需要指向分配的类数组中的第一个对象才能使用“ delete [] ptrName”?

目前,我正在编写一些代码,以练习我在在线教程中研究的内容。在这段代码中,我使用指针使用“ new”分配了一些空间来创建类实例,并遍历它们以设置其名称。但是,我只能在指针位于第0位时删除它们。有人可以解释一下我是否对此想法有误,或者对此的一般规则是什么?

//头文件

#include <iostream>
using namespace std;

class Animal {
private:
    string name;
    int age;

public:
    Animal(string name = "UNDEFINED", int age = 0): name(name), age(age) {cout << "Animal created" << endl;}
    ~Animal() {cout << "Animal killed" << endl;}
    void setName(char name) {this->name = name;}
    void speak() {cout << "My name is: " << name << ", and my age is: " << age << endl;}

};
Run Code Online (Sandbox Code Playgroud)

//主文件

#include "Animal.h"

int main() {
    char name = 'a';

    Animal *animals …
Run Code Online (Sandbox Code Playgroud)

c++

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

scanf()中%u和%d之间的差异

在C++中,如果我从一个字符串中读取一个整数,那么我是否使用ud作为转换说明符并不重要,因为它们都接受负整数.

#include <cstdio>
using namespace std;

int main() {
    int u, d;
    sscanf("-2", "%u", &u);
    sscanf("-2", "%d", &d);
    puts(u == d ? "u == d" : "u != d");
    printf("u: %u %d\n", u, u);
    printf("d: %u %d\n", d, d);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone.com

我挖得更深,发现是否有任何区别.我找到

int u, d;
sscanf("-2", "%u", &u);
sscanf("-2", "%d", &d);
Run Code Online (Sandbox Code Playgroud)

相当于

int u, d;
u = strtoul("-2", NULL, 10);
d = strtol("-2", NULL, 10);
Run Code Online (Sandbox Code Playgroud)

根据cppreference.com.

是否有任何差异之间的所有ud使用解析这些转换说明,即传递给格式时scanf …

c++ scanf cstdio

-1
推荐指数
1
解决办法
9112
查看次数