在DirectoryWalker类中,我想知道File实例是否实际上是指向目录的符号链接(假设,walker在UNIX系统上行走).鉴于,我已经知道实例是一个目录,以下是确定符号链接的可靠条件吗?
File file;
// ...
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
// real directory ---> do normal stuff
}
else {
// possible symbolic link ---> do link stuff
}
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚以下崩溃的原因(MSVC9):
//// the following compiles to A.dll with release runtime linked dynamically
//A.h
class A {
__declspec(dllexport) std::string getString();
};
//A.cpp
#include "A.h"
std::string A::getString() {
return "I am a string.";
}
//// the following compiles to main.exe with debug runtime linked dynamically
#include "A.h"
int main() {
A a;
std::string s = a.getString();
return 0;
} // crash on exit
Run Code Online (Sandbox Code Playgroud)
显然(?)这是由于可执行文件和DLL的不同内存模型.可能是字符串A::getString()
返回是在A.dll中分配并在main.exe中释放?
如果是这样,为什么 - 以及在DLL(或可执行文件)之间传递字符串的安全方法是什么?不使用shared_ptr这样的包装器和自定义删除器.
虽然它似乎是一个非常常见的问题,但我没有收集到太多信息:如何在DLL边界之间创建有关内存分配的安全接口?
众所周知
// in DLL a
DLLEXPORT MyObject* getObject() { return new MyObject(); }
// in DLL b
MyObject *o = getObject();
delete o;
Run Code Online (Sandbox Code Playgroud)
肯定会导致崩溃.但是,由于像上面那样的交互 - 我敢说 - 并不罕见,因此必须有一种方法来确保安全的内存分配.
当然,人们可以提供
// in DLL a
DLLEXPORT void deleteObject(MyObject* o) { delete o; }
Run Code Online (Sandbox Code Playgroud)
但也许有更好的方法(例如smart_ptr?).我也读到了在处理STL容器时使用自定义分配器的问题.
所以我的调查更多的是关于处理这个主题的文章和/或文献的一般指示.是否存在需要注意的特殊谬误(异常处理?)并且这个问题仅限于DLL还是"受到"的UNIX共享对象?
好的 - 这可能是一个非常愚蠢的问题,但它一直困扰着我.
有语言吗?
class Animal;
class Ape : public Animal
{...}
void doStuff(Animal* animalPtr)
{
cout << "doing animal stuff" << endl;
}
void doStuff(Ape* apePtr)
{
cout << "doing ape stuff" << endl;
}
Animal *ape = new Ape();
doStuff(ape);
Run Code Online (Sandbox Code Playgroud)
会屈服"doing ape stuff"
吗?(请使用C++语法来支持我)为了澄清,我想要"一个接受参数的函数,并根据参数的类型对其进行操作".
它会有意义吗?当然,作为开发人员,您需要注意,因为看起来像Animal指针的实例实际上可能会调用Ape代码,因为在运行时它是指向的Ape实例.
出于教育目的,我在一些测试程序中使用cstrings.我想用占位符缩短字符串,例如"......".
也就是说,如果我的最大长度设置为13 ,"Quite a long string"
则会变为"Quite a lo..."
13.此外,我不想破坏原始字符串 - 因此缩短的字符串必须是副本.
下面的(静态)方法是我提出的.我的问题是:为类缩短的字符串分配内存的类是否也应该负责释放它? 我现在所做的是将返回的字符串存储在单独的"用户类"中,并将内存释放到该用户类.
const char* TextHelper::shortenWithPlaceholder(const char* text, size_t newSize) {
char* shortened = new char[newSize+1];
if (newSize <= 3) {
strncpy_s(shortened, newSize+1, ".", newSize);
}
else {
strncpy_s(shortened, newSize+1, text, newSize-3);
strncat_s(shortened, newSize+1, "...", 3);
}
return shortened;
}
Run Code Online (Sandbox Code Playgroud) 在 UNIX 进程之间交换中等大量数据(数兆字节,但不是千兆字节)的最佳方法是什么?
我认为,这将是内存映射文件,因为大小限制似乎足够可以忍受。
我需要双向通信,所以普通管道没有帮助。据我所知,套接字和 UDP 存在大小限制(另请参阅此处)。不确定 TCP 是否是在 . 的子进程和父进程之间进行通信的好主意fork()
。
阅读诸如此类的相关问题,有些人推荐了共享内存/ mmap,其他人推荐了套接字。
还有什么我应该调查的吗?例如,是否有一些更高级别的库可以通过提供数据的 XML 序列化/反序列化来帮助 IPC?
根据评论进行编辑:
在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据要求向儿童提供一些可能适合一个 UDP 数据包的关键数据。孩子们对按键数据进行操作,并向控制器提供基于按键的信息(信息大小可以是10-100MB)。
问题:响应数据的大小、通知父级有关密钥请求的机制、同步 - 父级在传递给子级后必须从其列表中删除密钥,不应发生重复的密钥处理。
Boost 和其他第三方库(不幸的是)不得使用。我也许可以使用SunOS 5.10系统提供的库。
正如我在另一个SO问题中所提到的,我遇到了这篇文章.当我通过MSVC7.1编译boost 1.40并弹出几个C4251警告时,问题出现了.
现在,在阅读完所述文章之后,我想知道:通常不鼓励导出模板代码,例如
class DLLEXPORT_MACRO AClass
{
public:
std::vector<int> getVecCopy() { return myVec; }
...
}
Run Code Online (Sandbox Code Playgroud)
假设此代码通过MSVC7.1编译为DLL.虽然从其他MSVC7.1代码引用时此代码不会产生任何错误,但据说在MSVC8代码中引用此DLL会在运行时产生崩溃(内存对齐问题?).
因为这显然很糟糕......什么是应对导出模板代码问题的"最佳实践"?