小编cad*_*luk的帖子

我们应该使用标准库中的异常类型吗?

C++标准库定义了一些异常类型,例如std::exception,std::bad_alloc,和std::logic_error.我们是否应该或允许在我们自己的代码中使用它们?

我们举一个具体的例子.我们定义一个类型Array,它保存固定数量的ints并抛出一个std::out_of_range"超出范围"的访问.它有一个成员函数Array::operator[](size_t i),其定义如下:

int& Array::operator[](size_t i) {
    if (i >= size)
        throw std::out_of_range({ "out of range" });

    return array[i];
}
Run Code Online (Sandbox Code Playgroud)

我认为,当然,我们可以使用它们(标准并没有真正禁止它),但它似乎脱离了背景.IMO,它类似于常数

const unsigned int percentFactor = 100;
Run Code Online (Sandbox Code Playgroud)

用于内存分配:

char* ptr = new char[percentFactor];
Run Code Online (Sandbox Code Playgroud)

percentFactor打算用一个相乘float/ double为了得到一个整数百分比的结果.如果它用于分配100 char秒,它会给出预期的结果,但两个LOC完全不相关.异常相同.如果std::out_of_range仅用于标准库中,并且我将在我自己的代码中使用它,异常机制本身可以工作,但它是无关的.

现在,我应该在我自己的程序/库/ API中使用它们吗?

c++ exception standard-library

4
推荐指数
1
解决办法
89
查看次数

如何在C / C ++中释放数组

int main() {
    // Will this code cause memory leak?
    // Do I need to call the free operator?
    // Do I need to call delete?
    int arr[3] = {2, 2, 3};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 此代码是否会造成内存泄漏?

  2. arr居住在哪里?在堆栈上还是在RAM中?

c c++ memory-leaks memory-management

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

使用const char*的奇怪的std :: cout行为

我有一个方法,它返回一个字符串以显示为错误消息.根据程序中出现此错误的位置,我可能会在显示错误消息之前添加一些解释.

string errorMessage() {
    return "this is an error";
}

// somewhere in the program...
const char* message = ("Some extra info \n" + errorMessage()).c_str();
cout << message << endl;
Run Code Online (Sandbox Code Playgroud)

(我将消息存储为const char*,因为我实际上会将此错误提供给另一个接受const char*参数的方法)

此时它输出垃圾(控制台上的不可打印的字符).

所以我玩了它,发现如果相反我做:

// somewhere in the program...
const char* message = ("Some extra info \n" + errorMessage()).c_str();
cout << ("Some extra info \n" + errorMessage()).c_str() << endl << message << endl;
Run Code Online (Sandbox Code Playgroud)

然后它会正确显示两次消息.

为什么提供额外的参数使其cout按我的意图工作?

c++ string iostream cout c-strings

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

如何禁用一条指令的中断?

有没有其他方法可以在只使用一条指令的时间内禁止中断而不是使用该指令?CLI

x86 assembly interrupt

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

为什么相机默认面向z轴的负端?

我正在从这个scratchpixel学习openGL ,这里是透视项目矩阵章节的引用:

摄像机沿世界坐标系负z轴指向,这样当一个点从世界空间转换到摄像机空间(然后从摄像机空间转换到屏幕空间)时,如果该点位于世界坐标系的左侧y轴,它也会映射到摄像机坐标系y轴的左侧.换句话说,当世界坐标系x轴也指向右边时,我们需要摄像机坐标系的x轴指向右边; 并且唯一可以获得该配置的方法是让相机向下看负z轴.

我认为这与镜像有关?但是这个解释让我很困惑...为什么默认情况下相机的坐标与世界坐标不一致(就像我们在openGL中创建的每个其他3D对象一样)?我的意思是,我们需要使用变换矩阵来转换相机坐标(无论我们想要什么,负z设置,我们都可以模拟它)...为什么要这么麻烦?

opengl 3d graphics geometry projection-matrix

3
推荐指数
2
解决办法
4340
查看次数

文件复制可以绑定CPU吗?

据我所知,CPU通常比I / O设备(如HDD,网络,RAM等)快,因此在复制文件时,瓶颈通常是I / O绑定的(对吗?)。

如果在某种情况下I / O设备比CPU更快(例如在虚拟机中),是否可以使CPU忙于移动数据(例如从缓冲区到内核空间,从内核空间到用户空间)?然后它会成为CPU绑定的吗?

linux io operating-system kernel linux-kernel

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

软盘读取(AH = 0x2,int 0x13)未完成

在我的引导程序的第二阶段,我试图将一些虚拟软盘上的扇区加载到bochs的内存中,但是在调用时int 0x13,例程就不会返回.

我相信我的第二阶段的相关代码是:

bootsys_start:
    mov %cs, %ax
    mov %ax, %ds

    /*
     * Remap IRQs. Interrupts have been disabled in the
     * bootloader already.
     */

    mov i8259A_ICW1($i8259A_IC4), %al
    out %al, i8259A_ICW1_ADDR($i8259A_MASTER)
    out %al, i8259A_ICW1_ADDR($i8259A_SLAVE)

    mov i8259A_ICW2($USER_INT_START), %al
    out %al, i8259A_ICW2_ADDR($i8259A_MASTER)
    mov i8259A_ICW2($USER_INT_START + 8), %al
    out %al, i8259A_ICW2_ADDR($i8259A_SLAVE)

    mov i8259A_ICW3($0x4), %al
    out %al, i8259A_ICW3_ADDR($i8259A_MASTER)
    mov i8259A_ICW3($0x2), %al
    out %al, i8259A_ICW3_ADDR($i8259A_SLAVE)

    mov i8259A_ICW4($i8259A_uPM & i8259A_x86), %al
    out %al, i8259A_ICW4_ADDR($i8259A_MASTER)
    out %al, i8259A_ICW4_ADDR($i8259A_SLAVE)

    call mm_detect

    /* Load the kernel …
Run Code Online (Sandbox Code Playgroud)

x86 assembly floppy bios bochs

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

数组初始化函数

我正在玩C++,我偶然发现了这个问题.我正在尝试初始化堆上的数组指针,并且它initialize()在输出的内部工作69,但是在main()它中,它与错误一起崩溃EXC_BAD_ACCESS.

#include <iostream>

void initialize(int* array, int size) {
    array = new int[size];

    // Testing
    array[2] = 69;
    std::cout << array[2] << std::endl; // Works fine
}

int main() {

    int size = 3;
    int* array;

    // Initializing
    initialize(array, size);

    // Testing
    std::cout << array[2] << std::endl; // Crash, EXC_BAD_ACCESS

    // Cleanup
    delete[] array;
    array = nullptr;


    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

请帮我理解这个问题.

是的,我知道我应该使用,std::vector但我想了解为什么这不起作用:)

c++ arrays pointers function new-operator

2
推荐指数
1
解决办法
5467
查看次数

页框编号与页表条目

那么页框号和页表项到底有什么区别呢?

以下哪一项是正确的:

physical_address = PTE * page_size + offset
Run Code Online (Sandbox Code Playgroud)
physical_address = PFN * page_size + offset
Run Code Online (Sandbox Code Playgroud)

paging operating-system memory-address

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

IRC中如何保证最短路径?

RFC 2810对于一对一通信有以下规定:

一对一的通信通常由客户端执行,
因为大多数服务器到服务器的流量并不是服务器
仅相互通信的结果。为了给客户端提供一种相互通信的方式
,要求所有服务器都能够
沿着生成树向一个方向发送消息,以便到达任何
客户端。因此,消息传递的路径是
生成树上任意两点之间的最短路径。

(强调我的。)

这个“一个方向”是什么意思呢?只针对一位客户?它如何“到达任何客户端”并找到“任意两点[IRC网络上的主机]之间的最短路径”?
为什么不直接存储客户端的 IP 地址并让 IP 完成其工作呢?毕竟,IRC 是建立在 TCP/ IP之上的。

irc networking path-finding

2
推荐指数
1
解决办法
208
查看次数