我在C++中创建一个简单的线程服务器应用程序,事实是,我使用libconfig ++来解析我的配置文件.好吧,libconfig不支持多线程,因此我使用两个包装类来完成"支持".点是,其中一个失败:
class app_config {
friend class app_config_lock;
public:
app_config(char *file) :
cfg(new libconfig::Config()),
mutex(new boost::mutex())
{
cfg->readFile(file);
}
private:
boost::shared_ptr<libconfig::Config> cfg;
boost::shared_ptr<boost::mutex> mutex;
};
Run Code Online (Sandbox Code Playgroud)
从我的main.cpp文件调用时失败可怕:
app_main::app_main(int c, char **v) : argc(c), argv(v) {
// here need code to parse arguments and pass configuration file!.
try {
config = app_config("mscs.cfg");
} catch (libconfig::ParseException &e) {
cout << "Parse error at line " << e.getLine() << ": " << e.getError() << endl;
throw;
} catch (libconfig::FileIOException &e) {
cout << "Configuration …Run Code Online (Sandbox Code Playgroud) c++ construction exception-handling member-variables function-try-block
好吧,我相信标题很简单.我已多次阅读过应该避免复制重物的事情,这似乎很合理(谁想成为记忆猪?).问题是,何时应将物体视为重物?有多少会员?
我熟悉C++,而且我遇到了内存管理问题.在C中,每当我想为任意数量的元素保留内存时,无论何种类型,我都会调用malloc()然后手动初始化(通过循环),以我想要的任何值.使用C++ new,一切都是自动初始化的.
问题是,我有一个BattlePoint类,它有点像这样:
class BattlePoint {
public:
BattlePoint(int x, int y) : x(x), y(y) { };
bool operator==(const BattlePoint &right);
virtual ~BattlePoint();
private:
int x, y;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,它通过初始化程序获取一些x和y值,然后从中设置自己的x和y.问题是,这个函数将从一个函数中调用,该函数将分配它们的数组:
BattleShip::BattleShip(BattlePoint start, enum shipTypeSize size, enum shipOrientation orientation) : size(size), orientation(orientation) {
points = new BattlePoint[size]; // Here be doubts.
}
Run Code Online (Sandbox Code Playgroud)
所以,我需要我的BattleShip的观点来保持一个BattlePoints数组,每个BattlePoints具有不同的初始值(例如0,1; 0,2; 0,3等).
问题是:我如何分配未初始化的内存?
朱利安
PS:我没有对工作方式做过任何测试new,我简单阅读维基百科关于它的文章说:
在C++编程语言中,以及在许多基于C++的语言中,new是一种语言结构,它在堆上动态分配内存并使用构造函数初始化内存.除了名为"placement new"的表单之外,新尝试在堆上为新数据分配足够的内存.如果成功,它会初始化内存并将地址返回给新分配和初始化的内存.但是,如果new无法在堆上分配内存,则会抛出std :: bad_alloc类型的异常.这消除了显式检查分配结果的需要.调用delete的调用必须在每次调用new时调用析构函数并将new分配的内存返回给堆,以避免内存泄漏.
placement new应该是解决方案,但它没有提到如何做到这一点.
PS 2:我知道这可以通过stdlib的vector类来完成,但是我故意避免使用它.
现在是时候了解MVC了,所以这就是我想要做的事情; 而且我无法获得模型应该做的事情.根据维基百科,一个模型:
该模型管理应用程序域的行为和数据,响应有关其状态的信息请求(通常来自视图),并响应指令以更改状态(通常来自控制器).在事件驱动的系统中,模型在信息发生变化时通知观察者(通常是视图),以便他们能够做出反应.
在CakePHP中,你应该以这种非常简单的方式建立一个模型:
<?php
class Posts extends AppModel {
var $name = 'Posts';
}
?>
Run Code Online (Sandbox Code Playgroud)
所以,如果我想要,例如,我的数据库中的最后10个帖子,我会创建一个看起来像这样的控制器:
<?php
class PostsController {
function retrieve_latest($number = 10) {
$posts = $this->Users->find(array(
'fields' => '*',
'order' => 'posts.post_id DESC',
'limit' => $number,
'page' => '1',
'conditions' => array('posts.post_display == 1')
));
$this->set('posts', $posts);
}
}
?>
Run Code Online (Sandbox Code Playgroud)
而这个人会传递一个调用posts我视图的变量,然后相应地渲染它.问题是,我的模型不应该做任何其他事情吗?因为如果它简单,那么自定义模型就没有意义了,我的意思是,它只是模型类的空扩展.