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中使用它们吗?
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)
此代码是否会造成内存泄漏?
arr居住在哪里?在堆栈上还是在RAM中?
我有一个方法,它返回一个字符串以显示为错误消息.根据程序中出现此错误的位置,我可能会在显示错误消息之前添加一些解释.
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按我的意图工作?
我正在从这个scratchpixel学习openGL ,这里是透视项目矩阵章节的引用:
摄像机沿世界坐标系负z轴指向,这样当一个点从世界空间转换到摄像机空间(然后从摄像机空间转换到屏幕空间)时,如果该点位于世界坐标系的左侧y轴,它也会映射到摄像机坐标系y轴的左侧.换句话说,当世界坐标系x轴也指向右边时,我们需要摄像机坐标系的x轴指向右边; 并且唯一可以获得该配置的方法是让相机向下看负z轴.
我认为这与镜像有关?但是这个解释让我很困惑...为什么默认情况下相机的坐标与世界坐标不一致(就像我们在openGL中创建的每个其他3D对象一样)?我的意思是,我们需要使用变换矩阵来转换相机坐标(无论我们想要什么,负z设置,我们都可以模拟它)...为什么要这么麻烦?
据我所知,CPU通常比I / O设备(如HDD,网络,RAM等)快,因此在复制文件时,瓶颈通常是I / O绑定的(对吗?)。
如果在某种情况下I / O设备比CPU更快(例如在虚拟机中),是否可以使CPU忙于移动数据(例如从缓冲区到内核空间,从内核空间到用户空间)?然后它会成为CPU绑定的吗?
在我的引导程序的第二阶段,我试图将一些虚拟软盘上的扇区加载到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) 我正在玩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但我想了解为什么这不起作用:)
那么页框号和页表项到底有什么区别呢?
以下哪一项是正确的:
physical_address = PTE * page_size + offset
Run Code Online (Sandbox Code Playgroud)
physical_address = PFN * page_size + offset
Run Code Online (Sandbox Code Playgroud) RFC 2810对于一对一通信有以下规定:
一对一的通信通常由客户端执行,
因为大多数服务器到服务器的流量并不是服务器
仅相互通信的结果。为了给客户端提供一种相互通信的方式
,要求所有服务器都能够
沿着生成树向一个方向发送消息,以便到达任何
客户端。因此,消息传递的路径是
生成树上任意两点之间的最短路径。
(强调我的。)
这个“一个方向”是什么意思呢?只针对一位客户?它如何“到达任何客户端”并找到“任意两点[IRC网络上的主机]之间的最短路径”?
为什么不直接存储客户端的 IP 地址并让 IP 完成其工作呢?毕竟,IRC 是建立在 TCP/ IP之上的。
c++ ×4
assembly ×2
x86 ×2
3d ×1
arrays ×1
bios ×1
bochs ×1
c ×1
c-strings ×1
cout ×1
exception ×1
floppy ×1
function ×1
geometry ×1
graphics ×1
interrupt ×1
io ×1
iostream ×1
irc ×1
kernel ×1
linux ×1
linux-kernel ×1
memory-leaks ×1
networking ×1
new-operator ×1
opengl ×1
paging ×1
path-finding ×1
pointers ×1
string ×1