当使用/ MAP参数或"生成映射文件"项目设置时,VC++链接器会产生.map文件的用途是什么?我什么时候需要它们?我如何从中受益?
我正在检查dynamic_cast的行为,发现当它失败时,仅当目标是引用类型时才抛出std :: bad_cast异常.如果目标是指针类型,则不会从强制转换中抛出异常.这是我的示例代码:
class A
{
public:
virtual ~A()
{
}
};
class B : public A
{
};
int main()
{
A* p = new A;
//Using reference
try
{
B& b = dynamic_cast<B&>(*p);
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
//Using pointer
try
{
B* pB = dynamic_cast<B*>(p);
if( pB == NULL)
{
std::cout<<"NULL Pointer\n";
}
}
catch(std::bad_cast exp)
{
std::cout<<"Caught bad cast\n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是"Caught bad cast"和"NULL pointer".代码使用VS2008编译.这是正确的行为吗?如果是,那为什么会有区别?
和我一起工作的实习生向我展示了他在计算机科学方面考试的关于字节序问题的考试.有一个问题显示ASCII字符串"My-Pizza",学生必须显示该字符串将如何在小端计算机的内存中表示.当然,这听起来像一个技巧问题,因为ASCII字符串不受端序问题的影响.
但令人震惊的是,实习生声称他的教授坚持认为该字符串将表示为:
P-yM azzi
Run Code Online (Sandbox Code Playgroud)
我知道这不可能是正确的.在任何机器上都不能像ASCII字符串那样表示ASCII字符串.但显然,教授坚持这样做.所以,我写了一个小C程序并告诉实习生把它交给他的教授.
#include <string.h>
#include <stdio.h>
int main()
{
const char* s = "My-Pizza";
size_t length = strlen(s);
for (const char* it = s; it < s + length; ++it) {
printf("%p : %c\n", it, *it);
}
}
Run Code Online (Sandbox Code Playgroud)
这清楚地表明字符串在内存中存储为"My-Pizza".一天后,实习生回到我身边,告诉我教授现在声称C正在自动转换地址,以正确的顺序显示字符串.
我告诉他他的教授很疯狂,这显然是错的.但是为了检查我自己的理智,我决定在stackoverflow上发布这个,所以我可以让其他人确认我在说什么.
所以,我问:谁在这里?
我知道SQL注入相当危险.现在在我的C#代码中,我用SqlCommand类构成参数化查询:
SqlCommand command = ...;
command.CommandText = "SELECT * FROM Jobs WHERE JobId = @JobId;";
command.Parameters.Add("@JobId", SqlDbType.UniqueIdentifier ).Value = actualGuid;
command.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
这会自动使我的代码免受SQL注入吗?我需要做些额外的事吗?
C++中的一个定义规则究竟是什么意思?我能找到的唯一值得信赖的事件是在C++编程语言中,第3版.编辑,第9.2.3节.除了那个规则之外,该规则是否有官方定义?
我正在实现一个自定义集合实现,可以是readonly或非readonly; 也就是说,所有改变集合的方法都会调用一个与道德相当的函数:
private void ThrowIfReadOnly() {
if (this.isReadOnly)
throw new SomeException("Cannot modify a readonly collection.");
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不确定应该使用哪种NotSupportedException或者InvalidOperationException我应该使用.
.net c# exception invalidoperationexception notsupportedexception
根据这个答案,当代码使用lambda方法内部的局部变量时,编译器将生成可以具有名称的额外类c__DisplayClass1.例如以下(完全无用的)代码:
class Program
{
static void Main()
{
try {
implMain();
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
static void implMain()
{
for (int i = 0; i < 10; i++) {
invoke(() => {
Console.WriteLine(i);
throw new InvalidOperationException();
});
}
}
static void invoke(Action what)
{
what();
}
}
Run Code Online (Sandbox Code Playgroud)
输出以下调用堆栈:
System.InvalidOperationException
at ConsoleApplication1.Program.<>c__DisplayClass2.<implMain>b__0()
at ConsoleApplication1.Program.invoke(Action what)
at ConsoleApplication1.Program.implMain()
at ConsoleApplication1.Program.Main()
Run Code Online (Sandbox Code Playgroud)
请注意,c__DisplayClass2其中有一个由编译器生成的用于保存循环变量的类的名称.
根据这个答案 c__DisplayClass "手段"
c - >匿名方法闭包类("DisplayClass")
好的,但"DisplayClass"在这里意味着什么?
这会产生什么类"显示"?换句话说,为什么它不是"MagicClass"或"GeneratedClass"或任何其他名称?
根据MSDN SecureString内容被加密以增加安全性,因此如果程序被交换到磁盘,则不能嗅探字符串内容.
我想知道这样的加密怎么样?算法是固定的,因此要么是熟知的,要么是免赔额的(比如工业算法中广泛使用的七种算法之一),并且程序中必须有一个密钥.因此,攻击者可以获取加密的字符串,获取密钥并解密数据.
这种加密如何有用?
我需要在std :: vector中找到一个元素位置,用它来引用另一个向量中的元素:
int find( const vector<type>& where, int searchParameter )
{
for( int i = 0; i < where.size(); i++ ) {
if( conditionMet( where[i], searchParameter ) ) {
return i;
}
}
return -1;
}
// caller:
const int position = find( firstVector, parameter );
if( position != -1 ) {
doAction( secondVector[position] );
}
Run Code Online (Sandbox Code Playgroud)
但是vector::size()返回size_t对应于unsigned不能直接存储的整数类型-1.当使用size_t而不是int作为索引时,如何表示在向量中找不到元素?
有一些情况,C++标准将其定义为未定义的行为.例如,如果我分配new[],然后尝试释放delete(不delete[])那是未定义的行为 - 任何事情都可能发生 - 它可能会起作用,它可能会崩溃,它可能会默默地破坏某些东西并设置一个定时问题.
解释这一点很有问题,新手可能会发生任何事情.他们开始"证明""这是有效的"(因为它确实适用于他们使用的C++实现),并询问"这可能是什么问题"?我能给出什么简洁的解释会激励他们不写这样的代码?
c++ ×5
.net ×4
c# ×4
security ×2
ascii ×1
c ×1
casting ×1
definition ×1
dynamic-cast ×1
encryption ×1
endianness ×1
exception ×1
lambda ×1
linker ×1
search ×1
securestring ×1
sql ×1
stl ×1
vector ×1
visual-c++ ×1