我想$HOME在我正在编写的C++程序中访问环境变量.如果我用C编写代码,我只是使用该getenv()函数,但我想知道是否有更好的方法来实现它.这是我到目前为止的代码:
std::string get_env_var( std::string const & key ) {
char * val;
val = getenv( key.c_str() );
std::string retval = "";
if (val != NULL) {
retval = val;
}
return retval;
}
Run Code Online (Sandbox Code Playgroud)
我应该用getenv()C++访问环境变量吗?是否有任何我可能遇到的问题,我可以通过一点点知识来避免?
我是否总是必须为从std::fstream类中实例化的对象指定绝对路径?换句话说,有没有办法指定它们的相对路径,例如项目路径?
我想要做的是#define宏:
#define a(2)
Run Code Online (Sandbox Code Playgroud)
然后在字符串文字中使用它:string = "a";.
我希望该字符串不被解释为字符串,而是获取值a,即2.我没有成功,任何人都可以帮忙吗?
我有一个简单的程序,我得到访问冲突*(str + start).为什么?我应该能够改变它.对?
void fn()
{
char *str = "Hello wordl!";
int end = strlen(str);
int start = 0;
end--;
while(start < end)
{
*(str + start) = *(str + end); <--- Access violation writing location *(str + Start).
end--;
start++;
}
}
Run Code Online (Sandbox Code Playgroud) 我知道有一些方法可以防止用户使用new和delete运算符来阻止在堆上创建类.我正试图做相反的事情.我有一个类,我想阻止用户在堆栈上创建它的实例,并且只有使用new运算符发起的实例才会编译.更具体地说,我希望以下代码在编译期间收到错误:
MyClass c1; //compilation error
MyClass* c1 = new MyClass(); //compiles okay
Run Code Online (Sandbox Code Playgroud)
通过搜索网络,我发现了如何做到这一点的建议:
class MyClass {
public:
MyClass();
private:
void destroy() const { delete this; }
...
private:
~MyClass();
};
int main(int argc,char** argv)
{
MyClass myclass; // <--- error, private destructor called here !!!
MyClass* myclass_ptr = new MyClass;
myclass_ptr->destroy();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这应该工作.为什么在创建实例时会调用析构函数MyClass?
我现在正在编写测试用例,并创建了一些我尝试阅读的测试文件.绝对路径是:
/home/user/code/Project/source/Project/components/Project/test/file.dat
Run Code Online (Sandbox Code Playgroud)
但是出于明显的原因,用绝对路径进行测试是不好的.所以我尝试将绝对路径转换为相对路径,我不知道为什么它不起作用.我用相对路径创建了一个文件
findme.dat
Run Code Online (Sandbox Code Playgroud)
我找到了它
/home/user/code/Project/build/source/Project/components/Project/test/findme.dat
Run Code Online (Sandbox Code Playgroud)
所以我创建了相对路径
/../../../../../../source/Project/components/Project/test/file.dat
Run Code Online (Sandbox Code Playgroud)
但该文件未打开且与is对象
无关std::ifstream is (path);,并且该is.is_open()函数返回fulse.
你能帮助我吗?
我在使用boost中的共享内存对象,因为需要将内存页锁定到物理内存中的实时C++应用程序.在增强中我没有看到这样做的方法.我觉得我错过了一些东西,因为我知道Windows和Linux都有办法做到这一点(mlock()和VirtualLock()).
我想在RAM上分配大约10 GB.但我得到错误:
错误C2148:数组的总大小不得超过0x7fffffff
我的简化代码是:
int main(){
char* myBuffer = new char[11000000000];
//char* myBuffer = new char[4000000000]; //compiled successfully
}
Run Code Online (Sandbox Code Playgroud)
我知道x86和x64之间的差异以及x86中的寻址大小限制.所以我将目标设置为x64.我也知道堆栈大小限制,但请注意我在堆上分配.
令人惊讶的是,当我使用下面的代码并成功编译时.
#include <memory>
int main(){
char* myBuffer = (char*) malloc(11000000000); //compiled successfully even much more than this size
}
Run Code Online (Sandbox Code Playgroud)
我使用new运算符时代码出了什么问题?
环境: Visual Studio 2013使用空项目,Windows server 2008 R2 Datacenter,128 GB RAM.
编辑:nm提供的链接不能完全回答我的问题.我也想知道为什么malloc效果不错但不是new?
请考虑以下情况:
我有一个头文件及其相应的源文件:
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
有人会告诉我怎么能避免这种情况吗?
提前致谢.
如果我CreateEvent在Windows中使用创建事件,如何在Visual Studio中使用调试器检查是否发出了该事件的信号? CreateEvent返回一个句柄,它不会让我访问很多信息.在我打电话之前WaitForSingleObject(),我想检查事件是否在我进入该功能之前发出信号.
c++ ×9
visual-c++ ×2
boost ×1
boost-thread ×1
c ×1
c++11 ×1
class-design ×1
exception ×1
fstream ×1
heap-memory ×1
ifstream ×1
macros ×1
new-operator ×1
windows ×1