如何在启动时将ac或c ++程序中的所有内存初始化为NaN(非数字)以进行gdb调试?
我相信默认情况下,gdb会以零初始化,但这通常对于查找由于初始化错误而崩溃的代码没有帮助。
PS:我想将每个变量和数组初始化为NAN(或一些垃圾),仅用于调试。我正在使用的程序具有数千个变量,因此更改每个变量非常繁琐...
我正在尝试将智能指针的向量排序到类.我使用结构作为第三个参数来std::sort用operator():
struct PhraseSmartPtrParseCreationComparer
{
bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
{
if (a.get() == nullptr)
return b.get() != nullptr;
if (b.get() == nullptr)
return a.get() != nullptr;
return *a < *b;
}
};
Run Code Online (Sandbox Code Playgroud)
偶尔,我得到一个分段错误,其中比较方法中的一个指针指向无效的结构; 总是一个.有趣的是,在排序之前,所有对象都是完整的; 我也尝试修改函数来删除引用位:const std::shared_ptr<Phrase> a,并在其他地方崩溃.
电话没什么特别的:
std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer());
Run Code Online (Sandbox Code Playgroud)
有什么我想念的东西或者我应该在其他地方寻找吗?
我正在尝试制作一个程序,它接收一个整数值,然后以十六进制打印出四个字节中的每一个的值。所以对于 255,它应该打印出 FF 00 00 00。这就是我的代码到目前为止的样子。
#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int num;
cout << "Enter an integer" << endl;
cin >> num;
int* p = #
unsigned char* q = (unsigned char*)p;
for (int i = 0; i < 4; i++) {
cout<< hex <<*(int*)(q+i) << " ";
}
}
Run Code Online (Sandbox Code Playgroud)
当我输入 255 时,它会打印出ff cc000000 cccc0000 cccccc00什么是 c?
nullptr除了每次访问都会导致访问冲突之外,是否有一种安全的方法可以在 C++ 中创建指针?
我不成功的尝试之一是将 1 添加到nullptr.
在我的特殊情况下,我需要 Visual Studio 2019 的解决方案。
我正在编写全局删除/新运算符的调试版本来检测内存泄漏,双重删除和删除未分配的内存.
就"新"运算符而言,我覆盖全局新运算符并使用宏传递文件名和行号信息.重写的"new"运算符将地址中的内存地址,文件名,大小和行号信息存储在地址中.
我也覆盖了"删除"操作符,从地图中删除了已删除的地址'条目.现在我想将已删除的内存信息存储在另一个映射中,该映射存储调用"delete"的文件名和行号信息.
但是delete运算符只接受参数(要删除的对象的内存地址).有人可以告诉如何检测代码中的双删除吗?
请考虑以下情况:
我有一个头文件及其相应的源文件:
exmp.h(头文件)
exmp.cpp(源文件)
在头文件中,我有一个函数声明,bubSort(...)其定义存在于
exmp.cpp
myClass::bubSort(...)
{
....
....
}
Run Code Online (Sandbox Code Playgroud)
其中,myClass->是exmp.h中定义的类
现在为了bubSort(...)在另一个文件Sample.cpp中使用该函数,我myClass在Sample.h中声明了如下所示:
/*Sample.h*/
class myClass;
class sampleClass
{
.....
.....
myClass *ptr;
};
Run Code Online (Sandbox Code Playgroud)
现在使用上面的内容ptr,我正在尝试访问bubSort(...)Sample.cpp,如下所示:
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
....
....
ptr->bubSort(...);
}
Run Code Online (Sandbox Code Playgroud)
上面的场景在编译期间没有给出任何错误,但是在执行时,当控件到达时ptr->bubSort(...);,我得到一个异常:
访问冲突读取位置0xcdcdcdcd
有人会告诉我怎么能避免这种情况吗?
提前致谢.
首先,我应该指定我正在使用Visual Studio中的clang编译器.在调试以下简单程序时,WinMain函数在满足特殊条件时返回变量的值.
#include <windows.h>
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
int var = 1;
var = var + 5;
}
Run Code Online (Sandbox Code Playgroud)
上面的内容将在调试器中输出:The program '[11396] Project1.exe' has exited with code 6 (0x6).只要在赋值的右侧表达式中有变量名,这种行为似乎就会发生.如果我要修改最后一行只分配一个文字,例如var = 5,每次输出都是一致的无关值:The program '[4148] Project1.exe' has exited with code -858993460 (0xcccccccc).
我怀疑这种行为与WinMain有关,因为当我使用普通的main()代替时,我得到预期的0的返回值.任何关于这种奇怪行为可能是什么原因的想法?
#include <string>
struct T1 { int mem; };
struct T2
{
int mem;
T2() { } // "mem" is not in the initializer list
};
int n; // static non-class, a two-phase initialization is done:
// 1) zero initialization initializes n to zero
// 2) default initialization does nothing, leaving n being zero
int main()
{
int n; // non-class, the value is indeterminate
std::string s; // class, calls default ctor, the value is "" (empty string)
std::string a[2]; // …Run Code Online (Sandbox Code Playgroud) 我有一个代码来检查变量的条件.
有时这个变量在内存中0xfdfdfdfd,当然它不能从那里读取.
如果变量为null,我会
if(!variable)
{
//report error or skip...
}
else
{
//do stuff with the variable...
}
Run Code Online (Sandbox Code Playgroud)
但显然0xfdfdfdfd意味着有一个变量,我只是无法访问它.
有没有我可以使用的检查(比如null),所以当我无法访问它时,我不会尝试弄乱变量?
在我的 VS2022 C++ 项目中,一段时间后出现问题。因为错误仅在 10 分钟后发生,所以我需要检查调用堆栈以查看错误发生之前发生了什么。
但是,调用堆栈太小。
它只是显示了这一点:
我已经手动设置断点来跟踪它,所以我知道在“ProcessTxtLine”之前有几个我自己的函数(显示在调用堆栈中),但在调用堆栈中它们不存在。所以我无法双击它们来快速到达那里。
因为我不知道还有什么可能是重要的,所以我发布了整个 VS 2022 窗口的屏幕截图。
谢谢。
编辑:
根据建议,我单击了第一个条目,然后选择了“加载符号”。
然而,这并没有帮助。它确实显示了更多,但仍然不是“我的”呼叫。
c++ ×8
c ×3
memory ×2
callstack ×1
debugging ×1
exception ×1
gdb ×1
hex ×1
linux ×1
memory-leaks ×1
new-operator ×1
sorting ×1
visual-c++ ×1
windows ×1