我有一个别人写的潜在不稳定的类,我不得不创建该类的对象数组.我提到该类是不稳定的,因此它可能偶尔会在默认构造函数中抛出异常.我无权访问源代码,只能访问已编译的二进制文件.
当我使用这些类型的对象分配动态数组时new
,这些坏对象之一可能会抛出异常.它抛出一个自定义异常,而不是std::bad_alloc
.无论如何,我需要让程序从异常中恢复并继续使用,尽管设置了一些错误标志,什么不是.我认为我应该delete
与数组关联的内存,以防止内存泄漏.
我的理由是,如果类抛出在数组中间某处构造元素的异常,那么该元素将无法正确构造,并且所有未来元素将被异常停止构造,但之前的元素将是因为在抛出异常之前发生了这种情况.我想知道,是不是一个好主意,打电话delete
的catch (...) { }
?我该如何解决这个内存泄漏?
Badclass* array = nullptr;
try {
array = new Badclass[10]; // May throw exceptions!
} catch (...) {
delete[] array;
array = nullptr;
// set error flags
}
Run Code Online (Sandbox Code Playgroud)
这是我在内存中可视化的方式.它是否正确?
array 0 1 2 3 4 5 6 7 8 9
___ __________________________________
| ---------->| :) | :) | :) | :) | :( | | | | | |
|___| |____|____|____|____|____|_|_|_|_|_|
Run Code Online (Sandbox Code Playgroud) 这段代码由我的老师提供给我,作为C++类中函数的一个例子.这对我来说似乎很奇怪.我一直习惯用a来结束一个函数}
.我认为只有类定义以};
.这里的函数定义以};
.除了公共或私人之外,课堂中的功能与独立功能有何不同?这只是C++的怪癖或特殊之处吗?
class GenericItem {
public:
void SetName(string newName) {
itemName = newName;
};
void SetQuantity(int newQty) {
itemQuantity = newQty;
};
void PrintItem() {
cout << itemName << " " << itemQuantity << endl;
};
private:
string itemName;
int itemQuantity;
};
Run Code Online (Sandbox Code Playgroud) 在Clang API中,有GotoStmt
和IndirectGotoStmt
。关于这两种goto陈述之间的区别,几乎没有解释。我知道这goto label;
是什么声明。但是什么是间接goto语句?我想知道C / C ++代码上下文中的含义,而不仅仅是Clang。拥有间接goto语句在语法上意味着什么?您可以提供一个代码示例吗?
编辑:以下问题很有趣。
所以这里有一长串if语句,它们应该检测值int[] anArray;
是否在一定范围内.anArray = new int[15];
值的int[] anArray;
起点anArray[0]
为:49 50 51 59 0 5 9 10 15 19 50 55 89 99 100
这是代码的一部分,用于确定给定值是否在一个范围内:
int[] counterarray = new int[10];
for (x = 14; x >= 0; x--)
{
System.out.println(anArray[x]);
if (anArray[x] >= 0 && anArray[x] < 10)
{
counterarray[0] = counterarray[0] + 1;
}
if (anArray[x] >= 10 && anArray[x] < 20)
{
counterarray[1] = counterarray[1] + 1;
}
if (anArray[x] >= 20 && anArray[x] …
Run Code Online (Sandbox Code Playgroud) 拥有代码(在C++源文件的全局范围内编译汇编指令)是否合法?以前,我的印象是除了Ch编程语言(C/C++的解释器)之外,你不能拥有代码C++程序的全局范围.代码/指令只能在函数体[期间]内!
但是,我发现你可以通过将它们分配给全局变量来调用C++中main函数之前的函数!这将涉及call
汇编代码中的指令.您还可以将两个变量的总和分配到汇编代码之外的另一个全局变量中.这几乎肯定会涉及到一个add
和mov
说明.如果该代码在全局范围内,在任何函数之外,何时执行?如果它+
是一个类类型的重载操作符,如果它内部有一个print语句,那么什么时候执行呢?
你也可以在C++程序的全局范围内拥有循环和控制结构,如果是,它们什么时候执行?对于其他程序构造,它们是否允许在全局范围内,在什么情况下,以及何时执行?
这个问题是对我发布的上一个问题的回答: 为什么我不能为C中的函数外的全局变量赋值?
对原始问题的回答断言,您不能拥有函数范围之外的代码.我认为我不完全理解这个规则,究竟是什么被认为是"代码".
int foo() {
cout << "Inside foo()" << endl;
return 5;
}
// is this not code?
int global_variable = foo();
// How does this statement work without generating code?
int a = 4;
int b = 5;
int c = a + b;
int main() {
// The program behaves as if the statements above were executed from
// top to bottom before …
Run Code Online (Sandbox Code Playgroud) 我需要使用平均支持恒定时间查找的数据结构。我认为使用 astd::unordered_map
是一个很好的方法。我的数据是数字的“集合”。
|115|190|380|265|
Run Code Online (Sandbox Code Playgroud)
这些数字不必按特定顺序排列。我需要O(1)
时间来确定这个数据结构中是否存在给定的数字。我有使用 a 的想法std::unordered_map
,它实际上是一个哈希表(我说得对吗?)。所以数字将是关键,然后我将只有虚拟值。
所以基本上我首先需要确定数据结构中是否存在匹配给定数字的键,然后我根据该条件运行一些算法。独立于该条件,我还想更新一个特定的键。假设190
,我想添加20
它,所以现在关键是210
。现在数据结构看起来像这样:
|115|210|380|265|
Run Code Online (Sandbox Code Playgroud)
我想这样做的原因是因为我有一个遍历二叉搜索树的递归算法。每个节点都有一个int value
, 和两个指向左右节点的指针。当到达叶节点时,我需要在“哈希表”数据结构中创建一个新字段,其中包含current_node->value
. 然后当我在递归中返回树时,我需要将每个节点的值依次添加到存储在键中的先前总和上。以及为什么我的数据结构(我建议应该是一个std::unordered_map
) 有多个数字字段,因为它们中的每一个都代表从树的叶节点到中间某个节点的唯一路径。我检查从叶子到给定节点的路径上所有节点值的总和是否等于该节点的值。所以基本上每个键都添加了节点的当前值,存储该路径上所有节点的总和。我需要扫描该数据结构以确定是否有任何字段或键等于当前节点的值。另外我想在接近恒定的时间内将新值插入到数据结构中。这是用于竞争性编程,我会犹豫使用std::vector
因为查找一个元素并插入一个元素需要线性时间,我认为。那会搞砸我的时间复杂度。也许我应该使用除 a 之外的其他数据结构std::unordered_map
?
我最近遇到了这段代码,我很困惑,它是做什么用的?
在C编程语言中,将变量void
类型转换为数据类型是什么意思?这有什么作用?
如果执行了诸如类型转换或加法之类的表达式,而结果没有立即分配给某个变量,则该结果将丢失。您为什么要这么做?这似乎是一个无用的表达。
代码示例:
int main(int argc, char *argv[])
{
/* void unused vars */
(void) argc;
(void) argv;
// more code here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
看来作者没有使用这些变量,但是为什么将它们转换为void
数据类型?您最好将它们转换为int
数据类型。
据我了解,以下代码的工作原理如下:
char* cptr = "Hello World";
Run Code Online (Sandbox Code Playgroud)
"Hello World"存在于.rodata
程序记忆的部分.字符串文字"Hello World"
返回一个指向字符串基址的指针,或者所谓的"数组"中第一个元素的地址,因为字符在内存中顺序排列,它将是'H'.这是我的小图,因为我可视化存储在内存中的字符串文字:
0x4 : 'H'
0x5 : 'e'
0x6 : 'l'
0x6 : 'l'
0x7 : 'o'
0x8 : ' '
0x9 : 'W'
0xa : 'o'
0xb : 'r'
0xc : 'l'
0xd : 'd'
0xe : '\0'
Run Code Online (Sandbox Code Playgroud)
所以上面的声明变成:
char* cptr = 0x4;
Run Code Online (Sandbox Code Playgroud)
现在cptr指向字符串文字.我只是在编写地址.
0xa1 : 0x4
Run Code Online (Sandbox Code Playgroud)
现在这段代码如何工作?
char cString[] = "Hello World";
Run Code Online (Sandbox Code Playgroud)
我假设在前面的情况下"Hello World"
也降级为'H'和0x4的地址.
char cString[] = 0x4;
Run Code Online (Sandbox Code Playgroud)
我在=
初始化char数组时使用的是重载赋值运算符.据我所知,仅在C字符串的初始化时,它会将char-by-char从给定的基址开始复制到C字符串中,直到它在复制的最后一个char时命中'\ 0'.它还为所有字符分配足够的内存.因为重载运算符实际上只是函数,我认为它的内部实现类似于strcpy()
.
我希望有一位经验丰富的C程序员确认我对这段代码如何工作的假设.这是我对字符串文字中的字符复制到其中后的C字符串的可视化: …
当你有这样的函数时,形参是一个引用,它变成了实参的另一个名称,这样当我们在函数内部修改形参时,函数外部的原始变量就被改变了。
void add_five(int& a)
{
a += 5;
}
int main()
{
int number = 3;
add_five(number);
std::cout << number << std::endl; // prints 8
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有一些在链接列表上工作的代码。我将两个Node*
s 传递给函数。
void LinkedList::move_five_nodes(Node* ptr1, Node* ptr2) { ... }
...
void LinkedList::anotherFunction()
{
Node* leader;
Node* trailer;
...
move_five_nodes(leader, trailer);
...
}
Run Code Online (Sandbox Code Playgroud)
leader
我认为和指针变量内的右值内存地址trailer
将被分配到Node*
左值ptr1
和中ptr2
。
Node* ptr1 = leader;
Node* ptr2 = trailer;
Run Code Online (Sandbox Code Playgroud)
问题在于ptr1
和ptr2
是函数内独立的局部变量。最初,它们指向与实际参数指针相同的位置。但是,我的函数移动了一些节点,并且在函数结束时,ptr1
和 的值ptr2 …
我想将浮点变量的值打印到屏幕上。我printf()
在 LLVM IR 代码中声明函数,并且它已成功链接。
每当我打印整数或字符数据类型或字符串时,都会printf()
像在 C 代码中打印它们一样将它们正常打印到屏幕上。但是,如果我将 a 传递给float
,printf()
它不会打印浮点数,而是打印0.000000
。我检查了多次源代码,语法似乎是正确的。应该是打印的吧2.75
!我正在查看这段代码,我完全不明白代码的行为与我编写的代码有何不同。
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@obj1 = global {i32, float, i8} zeroinitializer
@format_string = constant [10 x i8] c"%i %f %c\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main() {
entry:
%obj1 = load {i32, float, i8}, {i32, float, i8}* @obj1
%obj2 = insertvalue {i32, float, i8} %obj1, i32 44, 0
%obj3 = insertvalue {i32, float, i8} …
Run Code Online (Sandbox Code Playgroud)